1. 多组输入问题–补充上篇
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a, b;
while(scanf("%d%d", &a, &b) != EOF){
scanf("%d%d", &a, &b)
printf("%d\n", a + b);
}
return 0;
}
2. 简单模拟
理解题目意思,直接模拟计算
计算1-n的和:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
scanf("%d", &n);
int sum = 0; //注意初始化!
for(int i = 1; i <= n; i++){
sum += i;
}
printf("%d", sum);
return 0;
}
//注意边界值检测,不要只管样例
求Sn=a+aa+aaa+…+aa…aaa(有n个a)之值,其中a是一个数字。 例如:2+22+222+2222+22222(n=5)
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a, n;
scanf("%d%d", &a, &n);
int sn = 0, num = a;
for(int i = 0; i < n; ++i){
sn += num;
num = num * 10 + a; //任意数都是上一个数*10+a得到
//num = a * pow(10, i + 1) + num;
}
printf("%d",sn);
return 0;
}
3. 进制转换
反序数
设N是一个四位数,它的9倍恰好是其反序数(例如:1234的反序数是4321)
求N的值
#include <bits/stdc++.h>
using namespace std;
int main()
{
for(int i = 1000; i <= 9999; ++i){
int x = i * 9;
int y = 0, z = i;
while(z > 0)
{
y = y * 10 + z % 10;
z = z / 10;
}
if(x == y){
cout << i << endl;
}
}
return 0;
}
10进制转x进制(x<10)
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
scanf("%d", &n);
int ans = 0;
int a[105] = {0}, cnt = 0;
while(n > 0){//核心循环
ans = n % 2;
a[cnt++] = ans;
n /= 2;
}
int sum = 0;
for(int i = cnt - 1; i >= 0; i--){//反序
printf("%d", a[i]);
//sum = sum * 10 + a[i]; //输出为数字
}
cout << sum
return 0;
}
10进制转x进制(x>=10)
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
scanf("%d", &n);
int ans = 0;
int a[105] = {0}, cnt = 0;
while(n > 0){//核心循环
ans = n % 16;
if(ans < 10) a[cnt++] = ans + '0';
else a[cnt++] = (ans - 10) + 'A';
n /= 16;
}
for(int i = cnt - 1; i >= 0; i--){
printf("%c", a[i]); //记得打印为字符
}
return 0;
}
x进制转10进制(x==2)
#include <bits/stdc++.h>
using namespace std;
int main()
{
char s[105];
scanf("%s", s);
int ans = 0;
int len = strlen(s);
for(int i = 0; i < len; ++i){
ans = ans * 2 + (s[i] - '0');
}
cout << ans;
return 0;
}
x进制转10进制(x>10)
#include <bits/stdc++.h>
using namespace std;
int main()
{
char s[105];
int x;
scanf("%s%d", s, &x);
int ans = 0;
int len = strlen(s);
for(int i = 0; i < len; ++i){
ans = ans * x;
if(s[i] >= '0' && s[i] <= '9') ans += (s[i] - '0');
else ans += (s[i] - 'A' + 10);
}
cout << ans;
return 0;
}
x进制转y进制
#include <bits/stdc++.h>
using namespace std;
int main()
{//x y 都应该是字符串,只有十进制ans为数字
char s[105];
int x, y;
scanf("%s%d%d", s, &x, &y);
int ans = 0;//为10进制结果
int len = strlen(s);
for(int i = 0; i < len; ++i){
ans = ans * x;
if(s[i] >= '0' && s[i] <= '9') ans += (s[i] - '0');
else ans += (s[i] - 'A' + 10);
}
int n = ans;
int ans_y = 0;
int a[105] = {0}, cnt = 0;
while(n > 0){//核心循环
ans_y = n % y;
if(ans_y < 10) a[cnt++] = ans_y + '0';
else a[cnt++] = (ans_y - 10) + 'A';
n /= y;
}
for(int i = cnt - 1; i >= 0; i--){
printf("%c", a[i]); //记得打印为字符
}
return 0;
}
总结
核心就是数位的拆解和合并(10->x,x->10),拆解就是先取模,再除取整,合并就是先乘再加。
练习
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出
太长了,超过18位,longlong存不下,考虑用字符串存储
字符串模2,看尾数;除2,切半(有余数则下一位加(余数*10))。
#include <bits/stdc++.h>
using namespace std;
bool allzero(char s[], int len)
{
bool flag = 1; //全部为0
for(int i = 0; i < len; ++i){
if(s[i] != '0'){
flag = 0;
break;
}
}
return flag;
}
void divide(char s[], int len)
{
int res = 0, r = 0;
res = (s[0] - '0') % 2;
s[0] = (s[0] - '0') / 2 + '0';
for(int i = 1; i < len; ++i){
r = (s[i] - '0') % 2;
s[i] = (s[i] - '0' + 10 * res) / 2 + '0';
res = r;
}
}
int main()
{
char s[35];
while(scanf("%s", s) != EOF){
int len = strlen(s);
char a[1005], cnt = 0;
while(!allzero(s, len)){
a[cnt++] = s[len-1] % 2 + '0';
//printf("%c", a[cnt-1]);
divide(s, len);
len = strlen(s);
}
for(int i = cnt - 1; i >= 0; --i){
printf("%c", a[i]);
}
printf("\n");
}
return 0;
}
1176.对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们称B为A的二进制逆序数。 例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。
未得到答案,之后补充
二进制转换的问题,想必大家都没有问题了吧,比如给你一个十进制数13,其对应的二进制表示为:1101。因为13=123+1*22+021+1*20.江鸟整天胡思乱想,现在他想到一个问题:如果将平时二进制转换过程中的基数2变成-2,那么转换过来的数将又是什么呢?江鸟将这种转换方式称为“负二进制转换”,为了让大家接受他的理论,他举了个例子如下:
1*(-2)3+1*(-2)2+0*(-2)1+1*(-2)0=-3,所以-3的该种转换为1101.
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(cin >> n){
int a[105], cnt = 0;
if(n == 0) cout << 0;
while(n != 0){ //不能是n>0,因为输入小于0
a[cnt] = n % (-2);
n /= (-2);
if(a[cnt] == -1){
a[cnt] = 1;
n++;
}
cnt++;
}
for(int i = cnt - 1; i >= 0; --i){
cout << a[i];
}
cout << endl;
}
}