@P2Oileen
2019-08-02T05:43:21.000000Z
字数 1465
阅读 1093
由于数字中间没有空格,长度未知,所以读入方式选择字符串读入
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;
}