大整数的加法
http://noi.openjudge.cn/ch0106/10/
模拟算术
#include<iostream>
#include<cstring>
#define maxn 10000
using namespace std;
int ans[maxn];
int main()
{
char s1[maxn];
char s2[maxn];
cin>>s1>>s2;
int len1 = strlen(s1);
int len2 = strlen(s2);
int ptr = 0;//结果数组
int carry = 0;//进位
int i,j;
//从最低位开始加
for(i=len1-1,j=len2-1;i>=0||j>=0;i--,j--)//这里用或者的原因:两个都得算完才能出去
{
int x = carry;
if(i>=0)//s1如果还有数
{
x+=s1[i]-'0';
}
if(j>=0)//s2如果还有数
{
x+=s2[j]-'0';
}
ans[ptr++]=x%10;
carry = x/10;
}
//如果有最高位进位
if(carry)
ans[ptr++]= carry;
int flag = 1;//处理一下特殊用例 00000+00000
for(i=ptr-1;i>=0;i--)
{
//前导0不能输出
if(!ans[i]&&flag){
continue;
}
flag = 0;
printf("%d",ans[i]);
}
//全是0的情况
if(flag)
printf("0\n");
return 0;
}
计算2的n次方
http://noi.openjudge.cn/ch0106/12/
#include<iostream>
using namespace std;
int a[1010];
int main()
{
int n,i;
cin>>n;
int l=1;//指向最高位的后一位
a[0]=2;
for(i=1;i<n;i++)
{
for(int j=0;j<l;j++)
a[j]*=2;
for(int j=0;j<l;j++)
{
a[j+1]+=a[j]/10;
a[j] = a[j]%10;
}
//如果a[l]不等于零 说明进位了,l往后移动
if(a[l]!=0)
l++;
}
for(int j=l-1;j>=0;j--)
{
cout<<a[j];
}
cout<<endl;
return 0;
}
求10000以内n的阶乘
http://noi.openjudge.cn/ch0106/14/
#include<iostream>
#define maxn 40010
using namespace std;
int result[maxn];
int main()
{
int num;
cin>>num;
int index = 1;//最高位的位置
result[0]=1;
for(int i=1;i<=num;i++)
{
int carry=0;
for(int j=0;j<index;j++)
{
int tmp = result[j]*i+carry;//i 1~~~num 很大 相乘得到carry会很大
result[j] = tmp %10;
carry = tmp/10;
}
//为什么要while处理 i 1~~~num 很大 相乘得到carry会很大,所以要用while处理一下
while(carry)
{
result[index++] = carry%10;
carry/=10;
}
}
for(int i=index-1;i>=0;i--)
cout<<result[i];
cout<<endl;
return 0;
}