输出下标错误 (下标小于n)
要看清楚题目要求
int main()
{
int n,a[100],flag[100]={1}; //只赋给了f[0];
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
check(a,i,flag,n); //这是错误的,结合函数,此时后面的数组还未被赋值
}
void check(int a[],int i,int flag[],int n)
{
int x=a[i];
while(x>1){
if(x % 2 == 1) x=3*x+1;
else x/=2;
for(int j=0; j<n; j++){
if(a[j]==x) flag[j]=0;
}
}
}
修正后的解法:还是错了 不知道错在哪里
#include<stdio.h>
int check(int a[],int flag[],int n);
void paixu(int a[],int n);
int main()
{
int n,a[100],flag[100],cnt;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
flag[i] = 1;
}
paixu(a,n);
cnt = check(a,flag,n);
for(int i=n-1; i>-1; i--)
{
if(flag[i]) {
printf("%d",a[i]);
cnt--;
if(cnt > 0) printf(" ");
}
}
}
int check(int a[],int flag[],int n)
{
int x;
for(int i=0; i<n; i++)
{
x = a[i];
while( x>1 && flag[i] )
{
if(x % 2 == 1) x = 3*x+1;
else x /= 2;
for(int j=0; j<n; j++)
{
if(a[j] == x) {
flag[j]=0;
n--;
}
}
}
}
return n;
}
void paixu(int a[],int n)
{
int t;
for(int i = 0; i < n; i++)
{
int k = i;
for(int j=i+1; j<n; j++)
{
if(a[j]<a[k]) k = j;
}
if(k != i) {t=a[k];a[k]=a[i];a[k]=t;}
}
}
又写了一个:改成了桶排序,还是错了
#include<stdio.h>
int check(int a[],int flag[],int n);
int main()
{
int n,a[100],flag[100000],cnt,max=0;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
flag[a[i]] = 1;
if(a[i]>max) max = a[i];
}
cnt = check(a,flag,n);
for(int i = max; i>=0; i--)
{
if(flag[i]) {
printf("%d",i);
cnt--;
if(cnt > 1) printf(" ");
}
}
}
int check(int a[],int flag[],int n)
{
int x,cnt;
for(int i=0; i<n; i++)
{
x = a[i];
cnt = n; //初始赋值位置错误
while( x>1 )
{
if(x % 2) x = (3*x+1)/2;
else x /= 2;
for(int j=0; j<n; j++)
{
if(a[j] == x) {
flag[a[j]]=0;
cnt--;
}
}
}
}
return cnt;
}
终于过了www
#include<stdio.h>
int check(int a[],int flag[],int n);
int main()
{
int n,a[100],flag[100000],cnt,max=0;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
flag[a[i]] = 1;
if(a[i]>max) max = a[i];
}
cnt = check(a,flag,n);
for(int i = max; i>=0; i--)
{
if(flag[i]) {
printf("%d",i);
if(cnt > 1) printf(" ");
cnt--;
}
}
}
int check(int a[],int flag[],int n)
{
int x,cnt;
cnt = n;
for(int i=0; i<n; i++)
{
x = a[i];
while( x>1 )
{
if(x % 2) x = (3*x+1)/2;
else x /= 2;
for(int j=0; j<n; j++)
{
if(a[j] == x && flag[a[j]]) {
flag[a[j]]=0;
cnt--;
}
}
}
}
return cnt;
}
void paixu(int a[],int n)
{
int t;
for(int i = 0; i < n; i++)
{
int k = i;
for(int j=i+1; j<n; j++)
{
if(a[j]<a[k]) k = j;
}
if(k != i) {t=a[k];a[k]=a[i];a[k]=t;}
}
}
总结:要善于发现问题变量