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;
}
posted @ 2017-04-28 09:50  LFYZOI题解  阅读(533)  评论(0编辑  收藏  举报