十七
十七
Published on 2021-01-22 / 218 Visits
0
1

每日一练(1)

PAT1001 (3n+1)猜想

传送门

对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……

我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?

输入

每个测试输入包含 1 个测试用例,即给出正整数 n 的值。

3

输出

输出从 n 计算到 1 需要的步数

5

代码

#include<iostream>
using namespace std;
static int m=0;
int func(int n){
	if(n==1)return m;
	else if(n%2==0){
		m++;
		return func(n/2);
	}
		else if(n%2==1){
			m++;
			return func((3*n+1)/2);
		}	
}
int main(){
	int number;
	cin>>number;
	func(number);
	cout<<m;
	
	return 0;
} 

UVA492 【Pig-Latin】

请您编写一个程序,输入任意数量行的文本,并以Pig Latin输出。每行文本将包含一个或多个单词。一个“单词”被定义为一个连续的字母序列(大写字母和/或小写字母)。单词根据以下的规则转换为Pig Latin,非单词的字符在输出时则和输入中出现的完全一样:

  • [1] 以元音字母(a、e、i、o或u,以及这些字母的大写形式)开头的单词,要在其后面附加字符串“ay”(不包括双引号)。例如“apple”变成“appleay”。
  • [2] 以辅音字母(不是A, a, E, e, I, i, O, o, U 或 u的任何字母)开头的单词,要去掉第一个辅音字母,并将之附加在单词的末尾,然
    后再在单词的末尾加上“ay”。例如,“hello”变成“ellohay”。
  • [3] 不要改变任何字母的大小写。。

输入

This is the input.

输出

hisTay isay hetay inputay.

代码

#include <iostream>
using namespace std;
string str; 
int Ischar(char c){//判断是否是字母 
	if(c>='a'&&c<='z'||c>='A'&&c<='Z') 
		return 1;
	else return 0;
}
int Isvowl(char c){//判断是否元音 
	if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u')
		return 1;
	else if(c=='A'||c=='E'||c=='I'||c=='O'||c=='U')
		return 1;
		else return 0;
}
int main(){
	while(getline(cin,str)){
		int s=0;//当前位置 
		int t=0;//单词偏移量 
		while(str[s]){
			if(!Ischar(str[s])) {
				cout<<str[s++];
				t=s;//不是字母就是空格,输出这个空格,并且将偏移量设置为0 
			}
			else if(Ischar(str[t])){//是字母偏移量+1 
				t++;
			}
			else{
				if(!Isvowl(str[s])){//不是元音字母就从第二个字母打印 
					for(int i=s+1;i<t;++i){
						cout<<str[i];
					}
					cout<<str[s];
				}else//是元音字母,从第一个开始打印,并在结尾附加ay 
					for(int i=s;i<t;++i)
						cout<<str[i];
					cout<<"ay";
					s=t;
				
			}
			
		} 					
	}
		
	return 0;
}

特殊的四位数字

查找并列出所有以十进制表示的四位数,其四位数的总和等于以十六进制(以16为基数)表示的位数,并且也等于以十二进制表示的四位数的总和(以12为基数的符号。
例如,数字2991的(十进制)数字之和为2 + 9 + 9 + 1 =21。由于2991 = 1 * 1728 + 8 * 144 + 9 * 12 + 3,因此其十二进制表示为1893 12,这些数字总和也为21。但是十六进制的2991是BAF,而11 + 10 + 15 = 36,因此程序应拒绝2991。
但是,下一个数字(2992)在所有三个表示形式中的数字总和为22,因此2992应该在列出的输出上。(我们不希望使用少于四位数的十进制数字(不包括前导零),因此2992是第一个正确答案。)

输入

没有输出

输出

2992

2993

2994

2995

2996

2997

2998

2999

...

代码

#include<iostream>
using namespace std;
int Tosum(int num,int base){
	int sum=0;
	sum=num%base+(num/base)%base+(num/base/base)%base+(num/base/base/base)%base;
	return sum;
}
int main(){
	for(int i=2992;i<=9999;i++){
		if(Tosum(i,10)==Tosum(i,12)&&Tosum(i,12)==Tosum(i,16))
			cout<<i<<endl;
	} 
	
	return 0;
} 

PAT1002写出这个数

传送门

读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

输入

每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10e100。

1234567890987654321123456789

输出

在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。

yi san wu

代码

#include <iostream>
#include <string>
using namespace std;
int main() {
    string s;
    cin >> s;
    int sum = 0;
    string str[10] =  {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
    for (int i = 0; i < s.length(); i++)
        sum += (s[i] - '0');
    string num = to_string(sum);//将int转为string
    for (int i = 0; i < num.length(); i++) {
        if (i != 0) cout << " ";
        cout << str[num[i] - '0'];//将数字对应拼音输出
    }
    return 0;
}

Comment