C艹菜鸟请教一下大数相乘问题

``````#include<iostream>
#include<cstring>
#include<fstream>

void Multiply(char* str1, char* str2, char* Result);//相乘函数
void strRev(char* str);//字符串Reverse函数
void str2int(char* str);//将char - '0' 得到其代表的数值
void Carry(char* str); //计算进位函数
void int2str(char* str); //将所数值转换回 char

#define debug

int main()
{
#ifdef debug
std::ifstream in("Pr4_in.txt");
std::ofstream out("Pr4_out.txt");
std::cin.rdbuf(in.rdbuf());
std::cout.rdbuf(out.rdbuf());
#endif // debug

char Number_1[102], Number_2[102], Result[204]={'0'};
std::cin >> Number_1 >> Number_2;
Multiply(Number_1, Number_2, Result);
//    std::cout << Number_1 << std::endl << Number_2 << std::endl;
std::cout << Result << std::endl;
return 0;
}

void Multiply(char str1[], char str2[], char Result[])
{
int len1 = strlen(str1), len2 = strlen(str2); //Get the length.
strRev(str1); strRev(str2); //Reverse the string.
//Simulate the manual computing process;
str2int(str1); str2int(str2);
//Initiate the result.
for(int i=0; i<203; ++i)
Result[i] = '*';
Result[203] = 0;

for(int i=0; i<len1; ++i){
for(int j=0; j<len2; ++j){
int tmp= (int)str1[i] * (int)str2[j];
if(Result[i+j] != '*')
Result[i+j] += tmp;
else Result[i+j] = tmp;
//            if(tmp < 10){
//                Result[i+j] += tmp;
//                Carry(Result);
//            }
//            else{
//                int teens = tmp/10;
//                tmp %= tmp;
//                Result[i+j+1] += teens;
//                Carry(Result);
//            }
Carry(Result);
}
}
int2str(Result);
strRev(Result);
}

void strRev(char* str)
{
int low = 0, high = strlen(str) - 1;
while(low < high)
{
char tmp = str[low];
str[low] = str[high];
str[high] = tmp;
++low; --high;
}
}

void str2int(char* str)
{
int len = strlen(str);
for(int i=0; i < len; ++i){
str[i] -= '0';
}
}

void Carry(char* str)
{
int i=0;
while(str[i]){
if( str[i] >= 10 ){
int tmp = str[i];
str[i] = tmp % 10;
str[i+1] += tmp / 10;
}
++i;
}
}

void int2str(char* str)
{
int i = 0;
while(str[i] != '*'){
str[i] += '0';
++i;
}
str[i] = '\0';
}

``````

1个回答

3 年多之前 回复
3 年多之前 回复
3 年多之前 回复
3 年多之前 回复

1.蓝桥杯高精度乘法，程序应该是对了，可提交时一直是：![图片说明](https://img-ask.csdn.net/upload/202001/27/1580133392_433438.jpg) 我已经绝望了，试了无数次，这道题的错误率已经被我拉上来了，没脸再测了， 求大佬大哥大姐救救我！ ``` #include<iostream> #include <algorithm> #include<stdlib.h> #include <cstdio> #include <cstring> using namespace std; int a[101],b[101],sum[205],anum=1,bnum=1; char a1,b1; int main(){ memset(sum,0,sizeof(sum)); while((a1=getchar())!=' '){ a[anum]=a1-48; anum++; }anum--; while((b1=getchar())!='\n'){ b[bnum]=b1-48; bnum++; } bnum--; void f1(int,int); for(int i=1;i<=anum;i++){ f1(a[i],anum-i); } for(int i=bnum+anum;i>=1;i--){ if(i==bnum+anum&&sum[i]==0)continue; cout<<sum[i]; } return 0; } void f1(int cheng,int mi){ int mid[203]; memset(mid,0,sizeof(mid)); int i=mi+1,mnum=bnum; for(;mnum>=1;mnum--,i++){ mid[i]+=(cheng*b[mnum])%10; if((cheng*b[mnum])/10)mid[i+1]+=(cheng*b[mnum])/10; if(mid[i]>=10){ mid[i+1]+=mid[i]/10; mid[i]%=10; } if(mid[i+1]>=10){ mid[i+2]+=mid[i+1]/10; mid[i+1]%=10; } } void add(int*,int); add(mid,i); } void add(int *mid,int i){ for(int j=1;j<=i;j++){ sum[j]+=mid[j]; sum[j+1]+=sum[j]/10; sum[j+1]%=10; sum[j+2]+=sum[j+1]/10; sum[j+2]%=10; sum[j]%=10; } } ```

float rootbeer[10],tings[10][5],*pf,vable=2.2 int i =3 以下语句是错的吗，错在哪? scanf（“%f”,&rootbeer); rootbeer=vable; printf（“%f”,rootbeer）; things[5]=rootbeer; （答案上说是错在rootbeer不是float类型，看的很莫名其妙，望解答。。。）
C语言菜鸟求解~一个数组已经从小到大排序 加入一个数字后按照原来从小到大排序

#include<stdio.h> void main(){ float r,h,l,Pi,s,v,area; Pi=3.1415926; scanf("%f,%f",&r,&h); l=2*Pi*r; s=Pi*r*r; v=s*h; area=s*2+l*h; printf("圆柱的表面积为：area=%.3f\n",area); printf("圆柱的体积为：v=%.3f\n",v); }

C语言菜鸟请教关于一维数组简单问题

C++超大整数结构体实现乘法，就像要个乘法，网上的看不懂，希望来回答的能多写点注释或者给我讲讲！菜鸟求大佬
``` #include <stdio.h> #include <iostream> #include <string.h> #include <stdlib.h> #include <algorithm> using namespace std; //我们把输入的两个操作数放在结构体中方便解决 //首先，为了方便后面运算，我们先定义一个结构体把超长整数都定义为此类型 struct doublelong{ int d[1000]; //定义一维数组D int len; //下面定义构造函数，初始化，给予长度 doublelong(){ memset(d,0,sizeof(d)); //memset为初始化函数 数组d sizeof求出的d大小赋予空间 指向要填充的内存块d //d用于存放 输入的两个操作数 //全初始化为0 len=0; } }; //大整数使用字符串输入的， //下面将字符串储存的大整数 //存放在结构体中 doublelong change(char str[]){ doublelong a; a.len=strlen(str);//得出输入的大整数长度写入结构体中 for(int i=0;i<a.len;i++){ a.d[i]=str[a.len-i-1]-'0';//这里把大整数的地位切换为高位 反序 } return a; } //比较两个大整数的大小 int compare(doublelong a,doublelong b){ int g; //greater此处返回更大数字 g的值为1时a的值更大，2时b的值更大，为0时两个数字的值相等 //由于我们此函数只比较两个输入数字的绝对值，由于运算方式是单独判断符号所以不对符号进行比较 if(a.len>b.len){ g=1;return g;//a大于b } else if(a.len<b.len){ g=2; return g;//a<b } else{ for(int i=a.len-1;i>=0;i++) //一位位对比一位位读取向后读 { if(a.d[i]>b.d[i]) { g=1;return g; } if(a.d[i]<b.d[i]) { g=2;return g; } if(a.d[i]=b.d[i]) { g=0;return g; } } } } //下面是大数的四则运算法则 doublelong add(doublelong a,doublelong b) { doublelong c; int carry=0;//这里的carry表示进位 for(int i=0;i<a.len||i<b.len;i++) //循环向后读取相加 { int temp=a.d[i]+b.d[i]+carry; c.d[c.len++]=temp%10; //将我们相加得到的temp值给写入我们的输出大整数c中去 carry=temp/10;//求是否有进位 } if(carry!=0) {//如果最后一位的进位不为0，直接付给结果的最高位 c.d[c.len++] =carry; } return c;//程序结束返回doublelong c } void print(doublelong a) { for(int i=a.len-1;i>=0;i--) { printf("%d",a.d[i]); } } ```
C语言菜鸟 想问一下这个程序哪里有错误（关于指针和数组的问题）谢谢！
#include <stdio.h> #include <stdlib.h> #define N 5 #define M 3 void duru(int score[][M],long num[],int n) { int i,j; printf("Input student's ID and score as:MH EN PH:\n"); for(i=0;i<N;i++) { scanf("%ld",&num[i]); for(j=0;j<M;j++) { scanf("%d",&score[i][j]); } } } void aver(int score[][M],int n) { int i; float aver; float sum=0; for(i=0;i<N;i++) { sum=sum+score[i][0]; } aver=sum/N; printf("第一门课程平均数为%.2f\n",aver); } void fail(double(*p)[M]) { int i,j,count=0; double sum=0; for(i=0;i<N;++i) { count=0; sum=0; for(j=1;j<M;++j) { if(*(*(p+i)+j)<60) { count++; } } if(count>=2) { for(j=1;j<M;j++) { sum+= *(*(p+i)+j); } printf("该学生有超过两门以上课程不及格\n"); printf("\n平均成绩为%.3f\n",sum/M); } } } void youxiu(double(*p)[M]) { int i,j,count=0; double sum=0; for(i=0;i<N;i++) { count=0; sum=0; for(j=1;j<M;j++) { sum+=*(*(p+i)+j); if(*(*(p+i)+j)>=85) { count++; } } if(count==M) { printf("该学生全部课成绩在 85 分以上\n"); printf("\n平均成绩为%.3f\n",sum/M); } else( sum/M >= 90) { printf("该学生所有成绩平均分在 90 分以上\n"); printf("\n平均成绩为%.3f\n",sum/M); } } } int main() { int iSelect=1; int score[N][M],sum[N],n; long num[N]; printf("Input the total number of the students(n<=5):"); scanf("%d",&n); while(iSelect!=0) { printf(" Menu \n"); printf("**************************************************************************************\n"); printf("*1.任务1：录入每个学生的学号和成绩； *\n"); printf("*2.任务2：求第一门课的平均分； *\n"); printf("*3.任务3：找出有 2 门以上课程不及格的学生， 输出他们的学号、全部课程成绩、平均成绩； *\n"); printf("*4.任务4：找出平均成绩 90 分以上或全部课成绩在 85 分以上的学生。 *\n"); printf("*5.退出 *\n"); printf("**************************************************************************************\n"); scanf("%d",&iSelect); switch(iSelect) { case 1: duru(score,num,n); break; case 2: aver(score,n); break; case 3: fail(score,num,n); break; case 4: youxiu(score,num); break; case 5: break; } } return 0; } 有一个班 5 个学生，3 门课。用二维数组作函数参数编程实现如下菜单 驱动的学生成绩管理系统： （1） 录入每个学生的学号和成绩； （2） 求第一门课的平均分； （3） 找出有 2 门以上课程不及格的学生， 输出他们的学号、全部课程成绩、平均成绩； （4） 找出平均成绩 90 分以上或全部课成绩在 85 分以上的学生。 （5） 退出 要求：分别编 4 个函数，通过指针运算实现以上 4 个功能。

1·extends和use有什么区别？ 比如我这个4继承1 ``` use think\Controller; use think\Request; use app\test1\Controller\Ctrl1; class Ctrl4 extends Ctrl1 { public function index(){ //some code here... } } ``` 2·不实例化怎么操作父类的属性和非静态方法
DSP菜鸟请教DSP入门问题

c++中 strcmp短字符串反而比长字符串大
``` #include <iostream> #include <cstring> using namespace std; int main() { cout << strcmp("Java","Basical") <<endl; return 0; } ``` 我在dev c++和菜鸟工具在线编译上的结果都是1？难道4个字符比7个字符还要大吗？还是因为编译器的原因？strcmp不是比较ASCII码吗，可Java4个字符加起来的ASCII码也不会比Basical大啊，怎么会造成这个结果呢。。

c问题请教：：：：……

130 个相见恨晚的超实用网站，一次性分享出来

win10系统安装教程（U盘PE+UEFI安装）

C语言魔塔游戏

java源码分析 Arrays.asList()与Collections.unmodifiableList()
ArrayList支持所有的可选操作（因为一个UnsupportedOperationException异常都没有捕获到），所以要想拥有完备的功能，还是得使用ArrayList啊。 Arrays\$ArrayList除了set()操作外，都不支持。 Collections\$UnmodifiableRandomAccessList都不支持，名副其实的Unmodifiable不可修改。

Python爬虫爬取淘宝，京东商品信息

Java工作4年来应聘要16K最后没要,细节如下。。。

2020年，冯唐49岁：我给20、30岁IT职场年轻人的建议

1、骇客帝国(1999) 概念：在线/离线，递归，循环，矩阵等 剧情简介： 不久的将来，网络黑客尼奥对这个看似正常的现实世界产生了怀疑。 他结识了黑客崔妮蒂，并见到了黑客组织的首领墨菲斯。 墨菲斯告诉他，现实世界其实是由一个名叫“母体”的计算机人工智能系统控制，人们就像他们饲养的动物，没有自由和思想，而尼奥就是能够拯救人类的救世主。 可是，救赎之路从来都不会一帆风顺，到底哪里才是真实的世界？如何...

CPU对每个程序员来说，是个既熟悉又陌生的东西？ 如果你只知道CPU是中央处理器的话，那可能对你并没有什么用，那么作为程序员的我们，必须要搞懂的就是CPU这家伙是如何运行的，尤其要搞懂它里面的寄存器是怎么一回事，因为这将让你从底层明白程序的运行机制。 随我一起，来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说，我们首先就要搞明白它是怎么回事，也就是它的内部构造，当然，CPU那么牛的一个东...

Linux自学篇——linux命令英文全称及解释
man: Manual 意思是手册，可以用这个命令查询其他命令的用法。 pwd：Print working directory 意思是密码。 su：Swith user 切换用户，切换到root用户 cd：Change directory 切换目录 ls：List files 列出目录下的文件 ps：Process Status 进程状态 mkdir：Make directory ...
Python实战：抓肺炎疫情实时数据，画2019-nCoV疫情地图

NO.1 　有20瓶药丸，其中19瓶装有1克/粒的药丸，余下一瓶装有1.1克/粒的药丸。给你一台称重精准的天平，怎么找出比较重的那瓶药丸？天平只能用一次。 解法 有时候，严格的限制条件有可能反倒是解题的线索。在这个问题中，限制条件是天平只能用一次。 因为天平只能用一次，我们也得以知道一个有趣的事实：一次必须同时称很多药丸，其实更准确地说，是必须从19瓶拿出药丸进行称重。否则，如果跳过两瓶或更多瓶药...
Java与Python学习通法（1）和（2）序言和编程语言发展史怎么学
dd

Python基础知识点梳理
python常见知识点梳理 摘要： 本文主要介绍一些平时经常会用到的python基础知识点，用于加深印象。python的详细语法介绍可以查看官方编程手册，也有一些在线网站对python语法进行了比较全面的介绍，比如菜鸟教程： python3 教程|菜鸟教程 本文主要是介绍基础语法，操作实例在另一篇博客中单独介绍： python语言介绍 python是一门解释型语言，python的设计目标： 一门...
2020年2月全国程序员工资统计，平均工资13716元

Java坑人面试题系列: 包装类（中级难度）
Java Magazine上面有一个专门坑人的面试题系列: https://blogs.oracle.com/javamagazine/quiz-2。 这些问题的设计宗旨，主要是测试面试者对Java语言的了解程度，而不是为了用弯弯绕绕的手段把面试者搞蒙。 如果你看过往期的问题，就会发现每一个都不简单。 这些试题模拟了认证考试中的一些难题。 而 “中级(intermediate)” 和 “高级(ad...