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;
}