LFYZ-OJ ID: 1010 天使的起誓
思路
-
理解题目后,会发现是一个高精度除低精度求余问题,非常简单。
-
容易出错的地方是:求余结果为0的时候,此时,天使所在的盘子号码其实就是n,如果直接返回余数,得到的结果则是0。
-
被除数的范围是2~101000,需要的存储位数为1001,加上一个长度位,需要一个最小1002的数组,否则会发生计算溢出。
代码例程
#include<iostream>
#include<cstring>
using namespace std;
int m[1002]; //被除数,m[0]是位数,全局数组,默认初始化为0
int n; //除数n
void getm(){ //读取字符串(高精度数字)并转储于m数组中
char t[1001];
scanf("%s", t);
m[0]=strlen(t);
for(int i=1; i<=m[0]; i++)
m[i]=t[m[0]-i]-'0';
}
int yushu(int A[], int B){ //求余函数,A%B
int i, t=0; //t为余数,其实为“过程中被除数”
for(i=A[0]; i>=1; i--){
t=t*10+A[i];
A[i]=t/B;
t%=B;
}
if(!t) t=B; //余数为0,说明天使就在B盘子
return t;
}
int main(){
scanf("%d", &n);
getm();
printf("%d", yushu(m, n));
return 0;
}