寫在前面
感謝陳同學的協助,幫助寫了問題C:列印字母Z的題解,然后這次代碼會貼到題解上,下次測驗題解只會有思路,不會有代碼了,
不要抄代碼!!!
不要抄代碼!!!
不要抄代碼!!!
copy真的沒有意義,系統也會有查重功能的,如果到時候查出來是必須清零題數的,真的不值得,
不會可以問,但是不能不想,不去學,大部分的大學學習都是要靠自己自學的,
題解
記錄時間:2020.11.02 22:53
問題 A: I still love you very much!(續)
問題A
思路
將每一行的二進制數作為字符陣列回圈輸入,然后用回圈來求得,
因為每一行的二進制數控制為8位,那么我們可以用一個回圈來求得十進制的值,同時用一個字符陣列保存起來,
char a[15];
scanf("%s",a);
for(j=0;j<8;j++)
{
if(a[j]!='0')
sum+=pow(2,7-j);
}
完整代碼
#include<stdio.h>
int main()
{
int i,j,n;
scanf("%d",&n);
char ans[110];
for(i=0;i<n;i++)
{
int sum=0;
char a[15];
scanf("%s",a);
for(j=0;j<8;j++)
{
if(a[j]!='0')
sum+=pow(2,7-j);
}
ans[i]=sum;
}
for(i=0;i<n;i++)
{
printf("%c",ans[i]);
}
printf("\n");
}
問題 B: 書到用時方恨少
問題B
思路
此處主要考察了輸入輸出的格式符
常用格式符
| 格式符 | 解釋 |
|---|---|
| %d | 十進制int型整數 |
| %lld | 十進制long long 型整數 |
| %f | 用來輸出實數(小數或者叫浮點數),整數部分全部輸出,小數超過六位的四舍五入 |
| %lf | 建議以后實數全部使用%lf(double)來輸入輸出實數,相較于float精度更高,且大小更大 |
| %.2lf | 此處2是一個例子,表示保留2位小數,注意百分號后面的點一定要加 |
| %o | 八進制整數 |
| %x | 十六進制整數 |
考試時候是不能翻書的,如果你忘記了,你可以嘗試將26個字母全部試一遍,看看是哪個格式符,期末考試有時候比較喜歡考八進制和十六進制,
問題C:列印字母Z
下面有請陳老師講課
ok,are you ready?那我們正式開始了啊
那,首先我們來觀察一下圖形的特點,誒,不難發現,圖形的第一行跟最后一行都是滿滿的星星,對吧,那我們是不是可以這樣寫
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i==1||i==n)
printf("*");
}
}
誒,這個還是很好理解的對吧,程式段的意思是如果行標i為第一行或者最后一行,直接輸出n個星號,
好,接下來講一下中間行的輸出,中間行的輸出就有點難度了,也是這個程式的重點,仔細聽啊,
好,首先,還是先來觀察一下它的特點,誒,對,很顯然,每一行都只有一個星號對吧,而且星號的位置在不斷地向前移動,那么到這兒,我們可以聯想一下,星號前面的空格數是不是也在不斷減小啊,對吧,由此,我們能不能找一個與行標 i 有關的通項公式,這樣便可以知道每一個星號在它所處那一行上面的列標位置對吧,如果星號的位置知道了,那空格的輸出不就簡單了嗎,對吧,只要在星號位置前的列標上都輸出空格是不是就可以了,自己思考一下,ok,在這里解釋一下行標與列標的意思啊,用一個圖來表示吧
| 1 | 2 | 3 | 4 | |
|---|---|---|---|---|
| 1 | * | * | * | * |
| 2 | * | |||
| 3 | * | |||
| 4 | * | * | * | * |
這圖都這么明白了,應該都能理解啊
ok,接下來那我們來講一下這個通項公式怎么得來,首先我們觀察一下第二行上的星號處于哪一個列標位置,是3對吧,第三行的星號處于列標2,ok,讓我們來簡單的計算一下,應該是可以得到這樣的一個公式:列標=總行數-行標+1;c語言式子就是:j=n-i+1;(j代表列標,i是行標,n為我們自己輸入的圖形的總行數)
不多bb,然我們來套一下公式看一下能不嫩得到正確的列標位置吧,第二行星號列標:j=n-i+1=4-2+1=3; ok,第二行對了,再試試第三行看能不能也正確呢,第三行星號列標:j=4-3+1=2; 誒,是不是也對了,這就是星號在中間行中的位置求法,既然知道了星號的位置,那么什么時候輸出空格呢?不難看出,星號之前的所有列標位置上是不是都是空格啊,對吧,到這兒,程式是不是就已經解決了,搞懂了就很eazy,
完整代碼如下
#include<stdio.h>
int main()
{
int i,j,n,t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i==1||i==n)
printf("*");
else
{
if(j==n-i+1)
{
printf("*");
break;
}
else
printf(" ");
}
}
printf("\n");
}
}
}
這種圖形輸出,主要是找到那個與行標或者列標有關系的通項公式,相信大家都懂了,不懂得可以自己想一下或者把程式搞個數在草稿紙上運行一遍,不懂的實在不懂的也可以來問我,
ok,此題就講到這里,咳咳,下課,
問題 D: 開門見山
思路
題意決議:這個題是給你一個大小為n的陣列a,然后要求你重新排序這個陣列,使得排序后陣列中a[i]-i的絕對值之和最大,
分析:因為i是從1~n單調遞增的,那么我們想讓絕對值最大,便要使得a[i]是單調遞減的,大的在前小的在后,如此便使得a[i]-i的絕對值最大,那么和也為最大,
#include <stdio.h>
#include <math.h>
#define maxN 1000+10
int main()
{
int t;
scanf("%d",&t);
while(t--){
int ans=0,i,j,n,t,a[maxN];
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(a[j]<a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
for(i=0;i<n;i++)
{
ans+=abs(a[i]-(i+1));
}
printf("%d\n",ans);
}
}
問題 E: 第2147483647道簽到題
思路
簽到題,唯一坑點便是資料范圍問題,
| 資料型別 | 資料型別大小 |
|---|---|
| int | -231 ~ 231-1 (大概109) |
| long long int | -263~263-1(大概1018) |
然后等引數列求和公式即可求解,
#include <stdio.h>
int main()
{
long long n;
scanf("%lld",&n);
printf("%lld\n",(1+n)*((n+1)/2)/2);
return 0;
}
問題 F: HPJY衣服收藏家
思路
桶排原理: 桶排序適合知道需要排序的數的范圍大小,然后以此范圍開一個陣列,最后將每個數放到他陣列中對應的位置里,就和把一個一個數放到一個一個桶里一樣,所以叫桶排序,
#include <stdio.h>
int a[1000+10];
int main()
{
int i,n;
while(~scanf("%d",&n))
if(n==0)printf("??B\n");
else
{
for(i=0;i<n;i++)
a[i]=0;
for(i=0; i<n; i++)
{
int x;
scanf("%d",&x);
a[x]++;
}
for(i=0; i<=1000; i++)
{
if(a[i]!=0)
{
printf("%d ",i);
}
}
printf("\n");
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/202230.html
標籤:其他
上一篇:3維/點云/遙感資料集
