PAT (Basic Level) Practice (中文)

PAT (Basic Level) Practice (中文)

:卡拉兹(Callatz)猜想:

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

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

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

输出格式:
输出从 n 计算到 1 需要的步数。

说一下我学到的:
1.容易走入死循环,惯性思维会让输入时为奇数的n一直以3n+1的形式计算下去,会发现n一直增大,根本不会到1
2.要判断n输入的时候是否为1 这个是特殊情况需要另外打代码
3.注意n为奇数和偶数这两种情况需要用if, else来分开计算不然容易出现从一个情况出来又刚好符合并进入另一个情况的现象。ps这个问题针对我的代码情况:将step++的情况放在一轮计算结束处而不是单个奇数偶数情况下面都有。

我的代码下面展示一些 内联代码片

// A code block
var foo = 'bar';
#include <iostream>
using namespace std;
int main() {
  cout << "input a number" << endl;
  int a;
  int z = 0;
  cin >> a;
  if (a == 1) {
    z = 0;
  }
  while (a != 1) {
    if (a % 2 == 0) {
      a /= 2;
      z++;
    }

    else {
      a = (3 * a + 1) / 2;
      z++;
    }
  }
  cout << z << endl;
}




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

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

输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
说一下我学到的:
1.此处输入的n最大可取10的100次方,这意味着我们要先将其以字符串的形式输入再去分割转整数计算。我刚开始用了全程整型的办法,后来全删了重新打。
2.学习了字符串转整形的不错办法,用到了sstream库。
3.cin.get()可以单个一个一个地提取字符串里面的字符,用\n判断是否为换行,是则结束。
下面展示一些 内联代码片

// A code block
var foo = 'bar';
#include<iostream>
using namespace std;
#include<math.h>
#include<sstream>
#include<string>
int length(int y){ int z=0;
   while(y){
y/=10;
z++;
}return z;}
int main(){
char ch;
cin.get(ch);
int n,sum=0;
while(ch!='\n'){  
stringstream ss;
ss<<ch;
ss>>n;
sum+=n;
cin.get(ch);
}
int t=length(sum);
int sum1=0;
int u=pow(10,t-1);
for(int i=0;i<t;i++){
int o=sum%10;
sum1+=o*u;
sum/=10;
u/=10;
}
for(int i=0;i<t;i++){
    int single=sum1%10;
    sum1/=10;
    if(i!=t-1){    
switch(single){
case 0:cout<<"ling ";break;
case 1:cout<<"yi ";break;
case 2:cout<<"er ";break;
case 3:cout<<"san ";break;
case 4:cout<<"si ";break;
case 5:cout<<"wu ";break;
case 6:cout<<"liu ";break;
case 7:cout<<"qi ";break;
case 8:cout<<"ba ";break;
case 9:cout<<"jiu ";break;
default:break;
}
}
else{switch(single){
 case 0:cout<<"ling";break;
case 1:cout<<"yi";break;
case 2:cout<<"er";break;
case 3:cout<<"san";break;
case 4:cout<<"si";break;
case 5:cout<<"wu";break;
case 6:cout<<"liu";break;
case 7:cout<<"qi";break;
case 8:cout<<"ba";break;
case 9:cout<<"jiu";break;
default:break;   
}}}


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.breeze.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值