pat1005继续3n+1猜想c语言简单实现
关于思路的展开
对于题目而言很好理解就是找出在n个数3n+1猜想验证的过程中得到的数而这个数没有在待验证数中间出现那这个数就是关键数
第一件事把验证过程中的数字存入数组当中方便以后验证
int yanzheng[1000];
int u=0;
int guanjian[100];
for(int i=0;i<n;i++){
while(dyz[i]!=1){
if(dyz[i]%2==0){
yanzheng[u]=dyz[i]=dyz[i]/2;}
else{ yanzheng[u]= dyz[i]=(3*dyz[i]+1)/2;
}
u++;
}
}
第二件事遍历待验证的数组中的元素在我们验证过程中得到的数组里看看有没有
int you=0;
int x=0;
for(int i=0;i<n;i++){
for (int r=0;r<u;r++){
if(yanzheng[r]==jilu[i])
you++;
}
if(you==0){
guanjian[x]=jilu[i];
x++;
}
you=0;
}
第三件事将关键数数组输出排序输出
注意这里使用的排序算法是冒泡排序
for (int j=0;j<x-1;j++)
{
for (int swpe, i=0;i<x-1;i++){
if(guanjian[i]<guanjian[i+1]){
swpe = guanjian[i+1];
guanjian[i+1]=guanjian[i];
guanjian[i]=swpe;
}
}
}
for(int i=0;i<x;i++){
if(guanjian[i]!=1){
if(i==x-1){
printf("%d",guanjian[i]);
}else
printf("%d ",guanjian[i]);
}
}
最后总代码如下
#include<stdio.h>
int main()
{
int n;
scanf ("%d",&n);
int dyz[n];
int jilu[n];
for (int i=0;i<n;i++){
scanf("%d",&dyz[i]);
}
for (int i=0;i<n;i++){
jilu[i]=dyz[i];
}
int yanzheng[1000];
int u=0;
int guanjian[100];
for(int i=0;i<n;i++){
while(dyz[i]!=1){
if(dyz[i]%2==0){
yanzheng[u]=dyz[i]=dyz[i]/2;}
else{ yanzheng[u]= dyz[i]=(3*dyz[i]+1)/2;
}
u++;
}
}
int you=0;
int x=0;
for(int i=0;i<n;i++){
for (int r=0;r<u;r++){
if(yanzheng[r]==jilu[i])
you++;
}
if(you==0){
guanjian[x]=jilu[i];
x++;
}
you=0;
}
for (int j=0;j<x-1;j++)
{
for (int swpe, i=0;i<x-1;i++){
if(guanjian[i]<guanjian[i+1]){
swpe = guanjian[i+1];
guanjian[i+1]=guanjian[i];
guanjian[i]=swpe;
}
}
}
for(int i=0;i<x;i++){
if(guanjian[i]!=1){
if(i==x-1){
printf("%d",guanjian[i]);
}else
printf("%d ",guanjian[i]);
}
}
return 0;
}
最后注意数组的范围不要越界
这是作者交了很多次段错误后终于正确
如果有什么问题可以私信