您的位置:首页 > 其它

洛谷P1014 Cantor表

2016-07-08 16:48 435 查看
这个问题我当初看了好久都没看的清楚,后来不经意间歪歪脖子发现了规律。。。

1/1 1/2 1/3 1/4 1/5 …                                                          1/1

2/1 2/2 2/3 2/4 …                                                          2/1        1/2                          

3/1 3/2 3/3 …                        =====》                   3/1        2/2        1/3

4/1 4/2 …                                                            ...        ...        ...        ...

5/1 …                                                             





这个问题在判断的时候可以通过单数行和双数行来判定。i%2即可。判定后知道排放的顺序。

这个版本不用数组,因为用数组可能会出问题。(见后面)
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int n,js=1;
cin>>n;
for(int i=2;i<=n;i++){//因为每一行分子分母之和是一定的,故最小2开始
for(int j=1;j<i;j++){//分子不是0!要<j
if(js==n&&i%2==0){//如果分子分母之和是偶数,则在奇数行
cout<<i-j<<"/"<<j;//正向输出
}
else if(js==n&&i%2!=0){//如果分子分母之和是奇数,则在偶数行
cout<<j<<"/"<<i-j;//反向输出
}
js++;
}//如果计数到达了n,说明可以输出了。
}
return 0;
}

更优的解法,不要判断奇偶行数。 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,N=0,line=0,order=0;
int main() {
cin>>n;
while( N < n ){
line++;
N+=line;
}
order = line - (N-n) ;
cout<< line - order +1 << "/" << order;
return 0;
}

(这个版本RE,初步判断数组超界)

#include<iostream>
#include<cstdio>
using namespace std;
int fzz[1000010],fmz[1000010],js=1; //fzz:分子数组;fmz:分母数组;js:个数计数
int main(){
int h1,h2,n;
cin>>n;
for(int i=2;i<=n;i++){
for(int j=1;j<i;j++){
if(i%2==0){//如果行数是奇数
fzz[js]=i-j;fmz[js]=j;//因为分子分母之和是i,所以i-j;
js++;
}
else{//如果行数是偶数
fzz[js]=j;fmz[js]=i-j;//反向添加进数组
js++;//增加计数
}
}
}
cout<<fzz
<<"/"<<fmz
;//输出
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  洛谷