1007、1009:与进制问题、输出问题

1007

题目:本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立

思路:对于数字元素拆分,除法的计算方法用代码实现(唯一一点就是在输出的时候首元素按照输出的格式是不能有0的情况存在)

以下是我初次通过本地测试成功的代码,但是在上传到牛客的时候出现,实际结果没有输出q数组,我就很奇怪,我使用了相同测试用例到本地没有问题,但是在网上就是通过不了。

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

int main() {
	string str;
	int n,len;
	freopen("i.txt","r",stdin);
	char q[1001];
	cin>>str>>n;
	int mode=0;
	for(int i=0; i<str.length(); i++) {
		mode=mode*10+((int)str[i]-'0');
		q[i]=(char)mode/n+'0';
		mode%=n;
		len++;
	}
	for(int i=0; i<len; i++) {
		if(i==0&&q[i]=='0') {
				continue;
			}
		printf("%c",q[i]);
	}
	printf(" %d",mode);

	return 0;
}

参考代码:

#include<iostream>
#include<string>
using namespace std;
int main(){
    string a;
    int b;
    cin>>a>>b;
    int yu = a[0] - '0';
    for(int i = 1;i<a.size();i++){
        int tem = yu*10+ (a[i] - '0');
        cout<<tem/b;//输出结果
        yu = tem %b;
    }
    cout<<" "<<yu;//输出结果
    return 0;
}

然后就学会了:以后在获取到结果的时候,能通过使用for循环输出结果。这样就又省了一次for循环,减少代码运行的时间

改进代码:(以下代码就能顺利通过测试用例)

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

int main() {
	string str;
	int n,len;
	// freopen("i.txt","r",stdin);
	char q[1001];
	cin>>str>>n;
	int mode=0;
	for(int i=0; i<str.length(); i++) {
		mode=mode*10+((int)str[i]-'0');
		q[i]=(char)mode/n+'0';
		mode%=n;
		
		if(i==0&&q[i]=='0') {
			continue;
		}
		printf("%c",q[i]);
	}
	printf(" %d",mode);

	return 0;
}

2023.4.28

思路方面需要注意的一项是,当输入A<B的时候,这个时候需要输出0,这个测试用例可能在牛客网上面没有,但是我用我的代码到pat官网联系的时候,一开始找不到为啥只有一个测试用例没有通过,而且pat那里是不允许你查看测试用例那里没有通过,这时候就需要通过你平时训练自己找bug的能力了,有没有漏掉那个输入或者输入的方式那里需要注意的

这次我漏掉了A<B 的测试,例如输入3和5,输出就应该是0和3了

再次改进的代码:

#include<iostream>
#include<string>
using namespace std;
int main(){
    string a;
    int b;
    cin>>a>>b;//b=9
    int yu = a[0] - '0';
    if((yu<b)&&(a.size()==1))cout<<0;//改进添加的一行
    else{
        for(int i = 1;i<a.size();i++){
        int tem = yu*10+ (a[i] - '0');
        cout<<tem/b;
        yu = tem %b;
    }
    }
    
    cout<<" "<<yu<<endl;
    return 0;
}

总结

1.使用for循环顺手输出结果

2.字符转数字是使用了字符数字与字符数字‘0’的差值获取了整型数字

3.使用取余数的方式可以获取一串数字里面的元素。

4.需要注意一下测试用例,在输入的时候要尽可能把可能结果都计算在内,但是如果在时间有限的范围内,应尽可能拿到较多的分值,分值与时间比值要划算。练习还是尽可能用pat练习吧,当考试用了

1009

简单,但是麻烦

题目:

给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到
 一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的6174,这个神奇的数字也叫Kaprekar常数。
 
 例如,我们从6767开始,将得到
 
 7766 - 6677 = 1089
 9810 - 0189 = 9621
 9621 - 1269 = 8352
 8532 - 2358 = 6174
 7641 - 1467 = 6174
 ... ...
 
 现给定任意4位正整数,请编写程序演示到达黑洞的过程。

#include<iostream>
#include<cstdio>
#include<algorithm>

using namespace std;
bool cmp(int a,int b) {
	return a>b;
}

int main() {
	// freopen("in.txt","r",stdin);
	int num;
	cin>>num;
	do{
		int n[4];
		for(int i=3; i>=0; i--) {
			n[i]=num%10;
			num=num/10;
		}
		sort(n,n+4,cmp);
		printf("%d%d%d%d - %d%d%d%d = ",n[0],n[1],n[2],n[3],n[3],n[2],n[1],n[0]);
		num=(n[0]*1000+n[1]*100+n[2]*10+n[3])-(n[3]*1000+n[2]*100+n[1]*10+n[0]);
		printf("%d\n",num);	
	}while(num!=6174);
	return 0;
}

总结

尽量观察输出结果与获取的输入之间的连接,能少写代码就少写

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值