@P2Oileen
2019-08-02T05:43:21.000000Z
字数 1465
阅读 1198
由于数字中间没有空格,长度未知,所以读入方式选择字符串读入
char ch1[105];char ch2[105];scanf("%s",ch1);scanf("%s",ch2);int len1=strlen(ch1);int len2=strlen(ch2);
为了模拟人类纸面运算,我们将数组反序,注意ascii码与正常数字的区别
for(int i=0;i<len1;i++) a[i]=ch1[len1-i-1]-'0';for(int i=0;i<len2;i++) b[i]=ch2[len2-i-1]-'0';
加法的实现以及进位
int maxlen=max(len1,len2);int x;for(int i=0;i<maxlen;i++){c[i]=b[i]+a[i];x=c[i] / 10;//进位b[i+1]+=x;//加到哪里都可以c[i] %= 10; //只保留个位数}c[maxlen]=x;
删除前导0
while(c[maxlen]==0 && maxlen>=0) maxlen--;
排除0+0的情况,并输出结果
if(maxlen==-1){printf("0");return 0;}for(int i=maxlen;i>=0;i--) printf("%d",c[i]);
如果长度不同,长度长的那个数更大
如果长度相同,直接比较字典序
if(len1>len2) printf("A>B");else if(len2 > len1) printf("B>A");else if(len1==len2){if(strcmp(ch1,ch2)==1) printf("A>B");else if(strcmp(ch1,ch2)==0) printf("A=B");else printf("A<B");}
规则基本相同,进位处理不同。
读入并初始化
scanf("%s%d",ch1,&b);int len1=strlen(ch1);for(int i=0;i<len1;i++) a[i]=ch1[len1-i-1]-'0';
计算并进位
int x=0;for(int i=0;i<len1;i++){c[i]=a[i]*b+x;x=c[i] / 10;c[i] %= 10;}while(x!=0){c[len1]=x % 10;x/=10;len1++;}
去除前导零并排除特殊情况
while(c[len1]==0 && len1>=0) len1--;if(len1==-1){printf("0");return 0;}
输出
for(int i=len1;i>=0;i--) printf("%d",c[i]);
//openjudge 1.6-14#include <cstdio>#include <iostream>#include <cstring>using namespace std;int a[1000005],c[1000005];int main(){a[0]=1;c[0]=a[0];int len1=0;int n,x;scanf("%d",&n);for(int j=1;j<=n;j++){x=0;for(int i=0;i<=len1;i++){c[i]=a[i]*j+x;x=c[i] / 10;c[i] %= 10;}while(x!=0){len1++;c[len1]=x % 10;x/=10;}for(int i=0;i<=len1;i++) a[i]=c[i];}for(int i=len1;i>=0;i--) printf("%d",c[i]);return 0;}