Nenu算法复习第五章

目录

1150: 5101 十进制转换八进制

1151: 5102 Sky数

1152: 5111八进制转换十进制

1153: 5112确定进制


1150: 5101 十进制转换八进制

题目描述

把一个十进制正整数转化成八进制。

输入

若干行,每行仅含一个十进制表示的正整数a(0 < a < 65536)。

输出

针对输入的每一行输出a的八进制表示。

样例输入 复制

9
8

样例输出 复制

11
10
#include
using namespace std;
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int a[1000]={0};
        int len = 0;
        while(n)
        {
            a[len] = n%8;
            n/=8;
            len++;
        }
        for(int i = len-1;i>=0;i--)
        printf("%d",a[i]);
        cout<

1151: 5102 Sky数

题目描述

Sky从小喜欢奇特的东西,而且天生对数字特别敏感,一次偶然的机会,他发现了一个有趣的四位数2992,这个数,它的十进制数表示,其四位数字之和为2+9+9+2=22,它的十六进制数BB0,其四位数字之和也为22,同时它的十二进制数表示1894,其四位数字之和也为22,啊哈,真是巧啊。Sky非常喜欢这种四位数,由于他的发现,所以这里我们命名其为Sky数。但是要判断这样的数还是有点麻烦啊,那么现在请你帮忙来判断任何一个十进制的四位数,是不是Sky数吧。

输入

输入包括多个四位正整数,如果为0,则输入结束。

输出

若n为Sky数,则输出“#n is a Sky Number.”,否则输出“#n is not a Sky Number.”。每个结果占一行。注意:#n表示所读入的n值。

样例输入 复制

2992
1234
0

样例输出 复制

2992 is a Sky Number.
1234 is not a Sky Number.
#include
using namespace std;
int base(int n,int r)
{
    int sum = 0;
    while(n)
    {
        sum += n%r;
        n = n/r;
    }
    return sum;
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int count = 0;
        if(n==0)
        break;
        if(base(n,10)==base(n,12)&&base(n,10)==base(n,16))
        {
               printf("%d is a Sky Number.\n",n);
        }
        else
        printf("%d is not a Sky Number.\n",n);
    }
    return 0;
}

1152: 5111八进制转换十进制

题目描述

把一个八进制正整数转化成十进制。

输入

输入有多行,每行仅含一个八进制表示的正整数a,a的十进制表示的范围是(0 < a < 65536)。

输出

一行,a的十进制表示。

样例输入 复制

11
10

样例输出 复制

9
8
#include
#include
using namespace std;
int main()
{
    int n;
    while(cin>>n)
    {
        int a[1000]={0};
        int len = 0;int sum = 0;
        while(n)
        {
            a[len] = n%10;
            n /= 10;
            len++;
        }
        for(int i = len-1;i>=0;i--)
        sum+=a[i]*pow(8,i);
        cout<

1153: 5112确定进制

题目描述

6 * 9 = 42 对于十进制来说是错误的,但是对于13进制来说是正确的。即, 6(13) * 9(13) = 42(13), 而 42(13) = 4 * 131 + 2* 130 = 54(10)。 你的任务是写一段程序读入三个整数p、q和r,然后确定一个进制B(2 <= B <= 16) 使得 p * q = r。如果 B有很多选择,输出最小的一个。例如:p = 11,q = 11,r = 121。则有 11(3) * 11(3) = 121(3) 因为 11(3) = 1 * 31 + 1 * 30 = 4(10) 和 121(3) = 1 * 32 + 2 * 31 + 1 * 30 = 16(10)。 对于进制10。有 11(10) * 11(10) = 121(10)。这种情况下,应该输出3。如果没有合适的进制,则输出0。

输入

输入有T组测试样例。 T在第一行给出。每一组测试样例占一行,包含三个整数p、q、r。p、q、r的所有位都是数字,并且1 <= p、q、r <= 1,000,000。

输出

对于每个测试输出样例一行。该行包含一个整数:即使得p * q = r成立的最小的B。如果没有合适的B,则输出 0。

样例输入 复制

3
6 9 42
11 11 121
2 2 2

样例输出 复制

13
3
0
#include 
#include 

int to10(int, int);

int main()
{
	int T;
	int p,q,r,tp,tq,tr;
	int i;
	scanf("%d",&T);
	for(;T--;){
		scanf("%d %d %d",&p,&q,&r);
		if(p*q>r){
			// 10+进制
			for(i=11;i<17;i++){
				tp = to10(p,i);
				tq = to10(q,i);
				tr = to10(r,i);
				if(tp*tq==tr){
					break;
				}else if(tp*tqtr
					continue;
				}
			}
			if(tr==-1 || i>=17){
				// i>=17是题目的要求,如果题目不给进制范围的话,这里值判断tr是否等于-1
				printf("0\n");
			}else{ // tr!=-1 and i<17
				printf("%d\n",i);
			}
		}else{
			// 2~10进制
			for(i=2;i<=10;i++){
				tp = to10(p,i);
				if(tp==-1)
					continue;
				tq = to10(q,i);
				if(tq==-1)
					continue;
				tr = to10(r,i);
				if(tr==-1)
					continue;
				
				if(tp*tq==tr){
					break;
				}else if(tp*tqtr
					continue;
				}				
			}
			if(tr==-1 || i>10){
				// 没有
				printf("0\n");
			}else{ // tr!=-1 and i<=10
				printf("%d\n",i);
			}
		}
	}
	return 0;
}

 

 

 

 

你可能感兴趣的:(NENU算法课,算法)