难道洛谷评测机不能使用while(scanf())???!!!
查看原帖
难道洛谷评测机不能使用while(scanf())???!!!
54483
God·Hero楼主2020/10/19 21:36

本蒟蒻写这道题的时候,一开始是这样的:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int n,m[105],len,ans,Copy[105];
char ch;
bool check(){
	for(int i = 1;i <= len / 2;i ++)
		if(m[i] != m[len - i + 1])
			return 1;
	return 0;
}
int main(){
	scanf("%d",&n);
	while(~scanf("%c",&ch)){
		if(ch != '\n')
			m[++ len] = (ch >= '0' && ch <= '9') ? ch - '0':ch - 'A' + 10;
	}
	for(int i = 1;i <= len;i ++)
		swap(m[i],m[len - i + 1]);
	while(check() && ans <= 30){
		ans ++;
		for(int i = 1;i <= len;i ++){
			Copy[i] += m[i] + m[len - i + 1];
			Copy[i + 1] += Copy[i] / n;
			Copy[i] %= n;
		}
		if(Copy[len + 1] != 0)
			len ++;
		for(int i = 1;i <= len;i ++)
			m[i] = Copy[i];
		memset(Copy,0,sizeof(Copy));
	}
	if(ans <= 30)
		printf("STEP=%d",ans);
	else
		printf("Impossible!");
	return 0;
}

结果,除了最后一个测试点,其他全错,下个数据点一看,欸,没错啊,咋回事呢?

然后我又换了一种while(scanf()),就是:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int n,m[105],len,ans,Copy[105];
char ch;
bool check(){
	for(int i = 1;i <= len / 2;i ++)
		if(m[i] != m[len - i + 1])
			return 1;
	return 0;
}
int main(){
	scanf("%d",&n);
	while(scanf("%c",&ch) != EOF){
		if(ch != '\n')
			m[++ len] = (ch >= '0' && ch <= '9') ? ch - '0':ch - 'A' + 10;
	}
	for(int i = 1;i <= len;i ++)
		swap(m[i],m[len - i + 1]);
	while(check() && ans <= 30){
		ans ++;
		for(int i = 1;i <= len;i ++){
			Copy[i] += m[i] + m[len - i + 1];
			Copy[i + 1] += Copy[i] / n;
			Copy[i] %= n;
		}
		if(Copy[len + 1] != 0)
			len ++;
		for(int i = 1;i <= len;i ++)
			m[i] = Copy[i];
		memset(Copy,0,sizeof(Copy));
	}
	if(ans <= 30)
		printf("STEP=%d",ans);
	else
		printf("Impossible!");
	return 0;
}

结果和上面那个程序相同

最最最最后我换成了while(cin>>ch),即:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int n,m[105],len,ans,Copy[105];
char ch;
bool check(){
	for(int i = 1;i <= len / 2;i ++)
		if(m[i] != m[len - i + 1])
			return 1;
	return 0;
}
int main(){
	scanf("%d",&n);
	while(cin >> ch){
		if(ch != '\n')
			m[++ len] = (ch >= '0' && ch <= '9') ? ch - '0':ch - 'A' + 10;
	}
	for(int i = 1;i <= len;i ++)
		swap(m[i],m[len - i + 1]);
	while(check() && ans <= 30){
		ans ++;
		for(int i = 1;i <= len;i ++){
			Copy[i] += m[i] + m[len - i + 1];
			Copy[i + 1] += Copy[i] / n;
			Copy[i] %= n;
		}
		if(Copy[len + 1] != 0)
			len ++;
		for(int i = 1;i <= len;i ++)
			m[i] = Copy[i];
		memset(Copy,0,sizeof(Copy));
	}
	if(ans <= 30)
		printf("STEP=%d",ans);
	else
		printf("Impossible!");
	return 0;
}

结果就AC了?

咋回事?

有没有大佬为我解释下,谢谢。

2020/10/19 21:36
加载中...