这是一种套路题,要先记住大体流程,然后反复练习。
1.大整数的表示。
struct bign {
int d[1000]= {0};//大数的低位数放数组的低位,高位数放数组的高位,即顺位存储,方便加,减,乘。 而除比较特别。
int len = 0;
};
太晚了,改天理思路。
#include"stdio.h" #include"string.h" struct bign { int d[1000]= {0};//大数的低位数放数组的低位,高位数放数组的高位,即顺位存储 int len = 0; }; bign change(char str[]) { bign a; a.len = strlen(str); for(int i = 0; i < a.len ; ++i) { a.d[i] = str[a.len -1- i]-‘0‘; //逆着赋值 } return a; } //非负 高精度加法 bign add(bign a,bign b) { bign c; int carry = 0;//表示进位 for(int i = 0; i < a.len || i < b.len; ++i) {//以较长的为界限 int t = a.d[i]+b.d[i]+carry; c.d[c.len++] = t%10; carry = t/10; } if(carry != 0) //如果最后进位不为0,则直接赋给结果的最高位 c.d[c.len++] = carry;//最后len++是因为 len>=1 return c; } //非负 高精度减法 bign sub(bign a,bign b) { bign c; for(int i = 0; i < a.len || i < b.len; ++i) { if(a.d[i] < b.d[i]) { a.d[i+1]--; a.d[i]+=10; } c.d[c.len++] = a.d[i]-b.d[i]; } //结果最少有一位数,且去掉高位多余的0,例如 88-88 = 0,len=1 while(c.d[c.len -1] == 0 && c.len > 1) { //len<=1不执行 c.len--; } return c; } //非负 高精度与低精度的乘法 bign multi(bign a,int b) { bign c; int carry = 0;//进位 for(int i = 0; i < a.len ; ++i) { int t = a.d[i]*b + carry; c.d[c.len++] = t%10;//个位作为该位结果 carry = t/10;//高位部位作为新的进位 } while(carry != 0) { //进位可能不止一位 c.d[c.len++] = carry%10; carry/=10; } return c; } //非负 高精度与低精度的除法 bign div(bign a,int b,int &r) { bign c; r = 0;//余数初始为0 c.len = a.len; //令商与被除数的初始的位数相等 for(int i = a.len-1; i>=0; --i) { r = r*10+a.d[i]; //关键一步,与上一位余数组合 c.d[i] = r/b; r = r%b; } while(c.d[c.len-1] == 0 && c.len > 1) { c.len--; } return c; } void print(bign a) { //输出bign for(int i = a.len-1; i >=0; --i) { printf("%d",a.d[i]); } } int main() { // char str1[1000],str2[1000]; // gets(str1); // gets(str2); // bign a = change(str1); // bign b = change(str2); // print(add(a,b)); // printf("\n"); // print(sub(a,b)); // printf("\n"); // print(multi(a,3)); // printf("\n"); // int r; // print(div(a,7,r)); // printf(" %d",r); char s[1000]; int a,r; scanf("%s %d",s,&a); bign S = change(s); print(div(S,a,r)); printf(" %d",r); return 0; }
原文:https://www.cnblogs.com/keep23456/p/12305691.html