【1001】害死人不償命的(3n+1)猜測html
卡拉茲(Callatz)猜測:ios
對任何一個正整數 n,若是它是偶數,那麼把它砍掉一半;若是它是奇數,那麼把 (3n+1) 砍掉一半。這樣一直反覆砍下去,最後必定在某一步獲得 n=1。卡拉茲在 1950 年的世界數學家大會上公佈了這個猜測,傳說當時耶魯大學師生齊動員,拼命想證實這個貌似很傻很天真的命題,結果鬧得學生們無意學業,一心只證 (3n+1),以致於有人說這是一個陰謀,卡拉茲是在蓄意延緩美國數學界教學與科研的進展……git
咱們今天的題目不是證實卡拉茲猜測,而是對給定的任一不超過 1000 的正整數 n,簡單地數一下,須要多少步(砍幾下)才能獲得 n=1?數組
輸入格式:函數
每一個測試輸入包含 1 個測試用例,即給出正整數 n 的值。測試
輸出格式:spa
輸出從 n 計算到 1 須要的步數。code
輸入樣例:3 htm
輸出樣例:5blog
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
for(int i=0;n!=1;i++)
{
if(n%2)
n=(3*n+1)/2;
else
n/=2;
}
cout<<i<<endl;
return 0;
}
【1002】寫出這個數
讀入一個正整數 n,計算其各位數字之和,用漢語拼音寫出和的每一位數字。
每一個測試輸入包含 1 個測試用例,即給出天然數 n 的值。這裏保證 n 小於 10^100。
在一行內輸出 n 的各位數字之和的每一位,拼音數字間有 1 空格,但一行中最後一個拼音數字後沒有空格。
1234567890987654321123456789
yi san wu
#include<iostream>
using namespace std;
int main()
{
char num[100]={0};
int digit[100]={0};
int sum=0;
fgets(num,100,stdin);
for(int i=0;num[i]!='\n';i++)
{
sum+=num[i];
}
for(int j=0;sum!=0;j++)
{
digit[j]=sum%10;
sum/=10;
}
for(int k=j-1;k>=0;k--)
{
switch(digit[k]){
case 0:
{
printf("ling");
break;
}
case 1:
{
printf("yi");
break;
}
case 2:
{
printf("er");
break;
}
case 3:
{
printf("san");
break;
}
case 4:
{
printf("si");
break;
}
case 5:
{
printf("wu");
break;
}
case 6:
{
printf("liu");
break;
}
case 7:
{
printf("qi");
break;
}
case 8:
{
printf("ba");
break;
}
case 9:
{
printf("jiu");
break;
}
if(k!=0)
cout<<" ";
}
return 0;
}
Tips:fgets函數功能爲從指定的流中讀取數據,每次讀取一行。其原型爲:char *fgets(char *str, int n, FILE *stream);從指定的流 stream 讀取一行,並把它存儲在 str 所指向的字符串內。當讀取 (n-1) 個字符時,或者讀取到換行符時,或者到達文件末尾時,它會中止。
姥姥的題解
#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);//將sum轉化爲string類型的num
for(int i=0;i<num.length();i++)
{
if(i!=0) cout<<" ";
cout<<str[num[i]-'0'];
}
return 0;
}
Tips:用string接收輸入,string的每一位數字累加到sum裏面,再將sum轉化爲string類型的num,對num的每一位輸出對應中文拼音。
【1003】我要經過
emmm目前仍是沒敲出來,姥姥的題解也沒有徹底理解,下次再寫
【1004】成績排名
讀入 n(>0)名學生的姓名、學號、成績,分別輸出成績最高和成績最低學生的姓名和學號。
每一個測試輸入包含 1 個測試用例,格式爲
第 1 行:正整數 n 第 2 行:第 1 個學生的姓名 學號 成績 第 3 行:第 2 個學生的姓名 學號 成績 ... ... ... 第 n+1 行:第 n 個學生的姓名 學號 成績
其中姓名
和學號
均爲不超過 10 個字符的字符串,成績爲 0 到 100 之間的一個整數,這裏保證在一組測試用例中沒有兩個學生的成績是相同的。
對每一個測試用例輸出 2 行,第 1 行是成績最高學生的姓名和學號,第 2 行是成績最低學生的姓名和學號,字符串間有 1 空格。
3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95
Mike CS991301
Joe Math990112
#include<iostream>
using namespace std;
int main()
{
int count=0,score;
int max=-1,min=101;
string maxName,minName,maxNum,minNum,name,num;
cin>>count;
for(int i=0;i<count;i++)
{
cin>>name>>num>>score;
if(score>max)
{
max=score;
maxName=name;
maxNum=num;
}
if(score<min)
{
min=score;
minName=name;
minNum=num;
}
}
cout<<maxName<<' '<<maxNum<<endl;
cout<<minName<<' '<<minNum<<endl;
return 0;
}
【1005】繼續(3n+1)猜測
卡拉茲(Callatz)猜測已經在1001中給出了描述。在這個題目裏,狀況稍微有些複雜。
當咱們驗證卡拉茲猜測的時候,爲了不重複計算,能夠記錄下遞推過程當中遇到的每個數。例如對 n=3 進行驗證的時候,咱們須要計算 三、五、八、四、二、1,則當咱們對 n=五、八、四、2 進行驗證的時候,就能夠直接斷定卡拉茲猜測的真僞,而不須要重複計算,由於這 4 個數已經在驗證3的時候遇到過了,咱們稱 五、八、四、2 是被 3「覆蓋」的數。咱們稱一個數列中的某個數 n 爲「關鍵數」,若是 n 不能被數列中的其餘數字所覆蓋。
如今給定一系列待驗證的數字,咱們只須要驗證其中的幾個關鍵數,就能夠沒必要再重複驗證餘下的數字。你的任務就是找出這些關鍵數字,並按從大到小的順序輸出它們。
每一個測試輸入包含 1 個測試用例,第 1 行給出一個正整數 K (<100),第 2 行給出 K 個互不相同的待驗證的正整數 n (1<n≤100)的值,數字間用空格隔開。
每一個測試用例的輸出佔一行,按從大到小的順序輸出關鍵數字。數字間用 1 個空格隔開,但一行中最後一個數字後沒有空格。
6
3 5 6 7 8 11
7 6
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int arr[10000];
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int count=0,n,flag=0;
cin>>count;
vector<int> v(count);
for(int i=0;i<count;i++)
{
cin>>n;
v[i]=n;
while(n!=1)
{
if(n%2)
n=3*n+1;
n/=2;
arr[n]=1;
}
}
sort(v.begin(),v.end(),cmp);//sort函數默認升序排序,用cmp函數實現降序排序
for(int i=0;i<count;i++)
{
if(arr[v[i]]==0)
{
if(flag==1)
cout<<" ";
cout<<v[i];
flag=1;
}
}
return 0;
}
Tips:sort函數默認升序排序,用cmp函數實現降序排序
【1006】換個格式輸出整數
讓咱們用字母 B
來表示「百」、字母 S
表示「十」,用 12...n
來表示不爲零的個位數字 n
(<10),換個格式來輸出任一個不超過 3 位的正整數。例如 234
應該被輸出爲 BBSSS1234
,由於它有 2 個「百」、3 個「十」、以及個位的 4。
每一個測試輸入包含 1 個測試用例,給出正整數 n(<1000)。
每一個測試用例的輸出佔一行,用規定的格式輸出 n。
234
BBSSS1234
23
SS123
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int i,j,k,count;
i=n%10;
j=(n%100)/10;
k=n/100;
while(k--)
cout<<"B";
while(j--)
cout<<"S";
if(i)
{
for(int m=1;m<i+1;m++)
cout<<m;
}
return 0;
}
【1007】素數對猜測:
d
輸入在一行給出正整數N
。
在一行中輸出不超過N
的知足猜測的素數對的個數。
20
4
#include<iostream>
using namespace std;
bool isPrime(int n)
{
for(int x=2;x*x<=n;x++)//必需要包含x*x=n的狀況
if(n%x==0)
return false;
return true;
}
int main()
{
int n,count=0;
cin>>n;
for(int i=5;i<=n;i++)//別忘了n自己也多是質數
if(isPrime(i)&&isPrime(i-2))
count++;
cout<<count;
return 0;
}
【1008】數組元素循環右移問題:
每一個輸入包含一個測試用例,第1行輸入N(1≤N≤100)和M(≥0);第2行輸入N個整數,之間用空格分隔。
在一行中輸出循環右移M位之後的整數序列,之間用空格分隔,序列結尾不能有多餘空格。
6 2
1 2 3 4 5 6
5 6 1 2 3 4
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
m=m%n;
vector<int> arr(n);
for(int i=0;i<n;i++)
cin>>arr[i];
reverse(begin(arr),begin(arr)+n);//sort(arr.begin(),arr.end(),bmp);
reverse(begin(arr),begin(arr)+m);
reverse(begin(arr)+m,begin(arr)+n);
for(int j=0;j<n-1;j++)
cout<<arr[j]<<" ";
cout<<arr[n-1];
return 0;
}
Tips:sort(arr.begin(),arr.end(),bmp);
數組長度爲n,要想把數組循環右移m位,只須要先將整個數組a倒置,再將數組前m位倒置,最後將數組後n-m位倒置便可完成循環右移m位。
reverse()函數能夠實現將一個數組或者vector中元素倒置,這個函數再algorithm頭文件中
若是m>n,那麼循環右移m位至關於循環右移m%n位,由於那些n倍數位的移動是多餘的,因此在使用m以前,先將m%n。
【1009】說反話
給定一句英語,要求你編寫程序,將句中全部單詞的順序顛倒輸出。
測試輸入包含一個測試用例,在一行內給出總長度不超過 80 的字符串。字符串由若干單詞和若干空格組成,其中單詞是由英文字母(大小寫有區分)組成的字符串,單詞之間用 1 個空格分開,輸入保證句子末尾沒有多餘的空格。
每一個測試用例的輸出佔一行,輸出倒序後的句子。
Hello World Here I Come
Come I Here World Hello
#include<iostream>
#include<stack>
using namespace std;
int main()
{
string s;
stack<string> st;
while(cin>>s)
st.push(s);
cout<<st.top();
st.pop();
while(!st.empty())
{
cout<<' '<<st.top();
st.pop();
}
return 0;
}
【1010】一元多項式求導
以指數遞降方式輸入多項式非零項係數和指數(絕對值均爲不超過 1000 的整數)。數字間以空格分隔。
以與輸入相同的格式輸出導數多項式非零項的係數和指數。數字間以空格分隔,但結尾不能有多餘空格。注意「零多項式」的指數和係數都是 0,可是表示爲 0 0
。
3 4 -5 2 6 1 -2 0
12 3 -10 1 6 0
#include<iostream>
using namespace std;
int main()
{
int a,b,flag=0;
while(cin>>a>>b)
{
if(b!=0)
{
if(flag==1)
cout<<" ";
cout<<a*b<<" "<<b-1;
flag=1;
}
}
if(flag==0)
cout<<"0 0";
return 0;
}算不超過#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
m=m%n;
vector<int> arr(n);
for(int i=0;i<n;i++)
cin>>arr[i];
reverse(begin(arr),begin(arr)+n);//sort(arr.begin(),arr.end(),bmp);
reverse(begin(arr),begin(arr)+m);
reverse(begin(arr)+m,begin(arr)+n);
for(int j=0;j<n-1;j++)
cout<<arr[j]<<" ";
cout<<arr[n-1];
return 0;N
的知足猜測的素),請計算不超過N
的知足猜測的素數對的個