今天课比较少,结构体相关的题目也刷完了,刷了一点菜鸟杯补题。
1.七进制与十进制相互转化,例题如下:
牛子爷赚了钱想存进T银行,但是T银行是7进制银行,里面的存款都是用7进制显示的.
牛子爷每次存完钱之后,不知道自己现在在银行的存款是多少
因为他不会10进制转换成7进制。
聪明的你,能帮帮牛子爷嘛?
格式
输入格式
输入一个数T代表有T组测试样例(1<=t<=1000)
第一行是两个正整数n,m(n代表牛子爷存这笔钱之前在T银行的存款(牛子爷在上次在T银行存款时看的),m代表牛子爷要存的钱的数量)
(0<=n<=10^6,0<=m<=10^6)
注意 n是7进制的数,m是10进制的数
输出格式
牛子爷在存完这笔钱之后在T银行的存款
样例
样例输入 Copy
2
10 7
6 10
样例输出 Copy
20
22
提示
在T银行的存款都是用7进制显示
10元存进T银行,你在T银行的存款会加上13(10转换成7进制是13)
牛子爷要存的钱是10进制数
首先,我们有两种方法。
第一种:是将输入的七进制转换成十进制,然后将两个十进制相加,最后再把这个十进制数据转换成七进制数据进行输出。
第二种方法:将十进制转化成七进制,再将七进制的两个数据进行相加后输出。
虽然第二种方法步骤比较少,但是七进制相加进位十分麻烦,所以相比之下第一种方法比较方便。
解法如下:
对于七进制转化成十进制的方法是从个位数字乘以七的零次方加十位数字乘以七的一次方再加上百位数字乘以七的二次方,依次类推。这里我们可以考虑把第一个七进制数字存在一个字符数组里面,方便我们提取它的每一位数字进行操作。
具体操作代码如下:
scanf("%s %d",&str,&m);
int n=strlen(str);
for(int i=0;i<n;i++)
{
sum =sum + (str[n-i-1] - '0') * pow(7,i);
}
接下来我们把令sum = sum + m;
然后把这个十进制数据再转换成七进制
具体方法即为短除法(代码如下)
for(int i=0;sum>0;i++)
{
a[i] = sum % 7;
sum = sum / 7;
n = i;
}
最后一步,判断并输出:
while(a[n] == 0) n--;
for(int i=n;i>=0;i--)
printf("%d",a[i]);
此题代码如下:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int number;
cin>>number;
for(int l=0;l<number;l++)
{
int sum = 0,m;
char str[1000]={'0'};
int a[1000]={0};
scanf("%s %d",&str,&m);
int n=strlen(str);
for(int i=0;i<n;i++)
{
sum =sum + (str[n-i-1] - '0') * pow(7,i);
}
sum = sum + m;
for(int i=0;sum>0;i++)
{
a[i] = sum % 7;
sum = sum / 7;
n = i;
}
while(a[n] == 0) n--;
for(int i=n;i>=0;i--)
printf("%d",a[i]);
cout<<endl;
}
return 0;
}