| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1162 人关注过本帖
标题:删数题:编译的时候提示错误缺少数组界限符
只看楼主 加入收藏
饭桶
Rank: 6Rank: 6
等 级:侠之大者
帖 子:165
专家分:422
注 册:2011-4-5
结帖率:100%
收藏
已结贴  问题点数:30 回复次数:6 
删数题:编译的时候提示错误缺少数组界限符
题目是:给定n 位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新的正整数。对于给定的n位正整数a 和正整数k,设计一个算法找出剩下数字组成的新数最小的删数方案。 对于给定的正整数a,编程计算删去k个数字后得到的最小数。
 
我编的源程序:
#include "stdio.h"
#include "math.h"
#define  p 10;
 long weishu( long n) //判断n的位数
                   {int weishu=0;
                    do
                     {n=n/10;
                       weishu++;
                     } while(n!=0);
                    return weishu;
                   }
int chaishu(int str1[],int n) //对n进行拆数
            {int i,w; long sum;
            
             for(i=0;i<=weishu(n)-1;i++)
              {w=weishu(n)-i;
               str1[i]=(int)(n/pow(10,w));
               sum=str1[i]*(int)pow(10,w);
               n=n-sum;
              
              }
             }
int shanshu(int str2[],int str3[],int n,int s) //把所输入的数字删啦
           {int j,k,l;
              for(j=0;j<=weishu(n)-1;j++)
                for(k=0;k<=weishu(s);k++)
                  if(str2[j]==str3[k])//判断是否相同
                   for(l=j;l<weishu(n);l++)
                     str2[l]=str2[l+1];//覆盖
                  
            
           }
int maopao(int str[],int n,int s)//用冒泡法排序
         {int a,b,temp;
          for(a=0;a<=weishu(n)-weishu(s);a++)
             for(b=0;b<weishu(n)-weishu(s)-a;b++)
                if(str[b]>str[b+1])
                  {temp=str[b];str[b]=str[b+1];str[b+1]=temp;}
               
         }
main()
{  long n,s; int a,b,w;int str4[p]; int str5[p];
  printf("please input the number:\n");//输入数
  scanf("%d",&n);
  chaishu(str4,n);//对n进行拆数
  printf("Input the number you wish to delete:\n");
  scanf("%d",&s);//输入所要删除的数
  chaishu(str5,s);
  shanshu(str4,str5,n,s);//删数
  maopao(str4,n,s);//冒泡
  w=weishu(n)-weishu(s);
  for(a=0;a<=w;a++)//确保所出的第一位不是0
      if(str4[a]==0) break;
  for(b=a;b<=w;b++)   
      printf("%d",str4[a]);//输出

  
}


为什么编译的时候总是提醒错误(我用的是c++6.0):
:\c的调试\分步.cpp(42) : error C2143: syntax error : missing ']' before ';'
I:\c的调试\分步.cpp(42) : error C2143: syntax error : missing ';' before ']'
I:\c的调试\分步.cpp(42) : error C2143: syntax error : missing ']' before ';'
I:\c的调试\分步.cpp(42) : error C2143: syntax error : missing ';' before ']'
搜索更多相关主题的帖子: 源程序 正整数 
2011-04-07 18:52
sange
Rank: 2
等 级:论坛游民
帖 子:12
专家分:26
注 册:2011-3-8
收藏
得分:26 
#include "stdio.h"
#include "math.h"
#define  p 10
long weishu( long n) //判断n的位数
                   {int weishu=0;
                    do
                     {n=n/10;
                       weishu++;
                     } while(n!=0);
                    return weishu;
                   }
void chaishu(int str1[],int n) //对n进行拆数
            {int i,w; long sum;
            
             for(i=0;i<=weishu(n)-1;i++)
              {w=weishu(n)-i;
               str1[i]=(int)(n/pow(10,w));
               sum=str1[i]*(int)pow(10,w);
               n=n-sum;
              
              }
             }
void  shanshu(int str2[],int str3[],int n,int s) //把所输入的数字删啦
           {int j,k,l;
              for(j=0;j<=weishu(n)-1;j++)
                for(k=0;k<=weishu(s);k++)
                  if(str2[j]==str3[k])//判断是否相同
                   for(l=j;l<weishu(n);l++)
                     str2[l]=str2[l+1];//覆盖
                  
            
           }
void  maopao(int str[],int n,int s)//用冒泡法排序
         {int a,b,temp;
          for(a=0;a<=weishu(n)-weishu(s);a++)
             for(b=0;b<weishu(n)-weishu(s)-a;b++)
                if(str[b]>str[b+1])
                  {temp=str[b];str[b]=str[b+1];str[b+1]=temp;}
               
         }
void main()
{  long n,s;
int a,b,w;
int str4[p];
int str5[p];
  printf("please input the number:\n");//输入数
  scanf("%d",&n);
  chaishu(str4,n);//对n进行拆数
  printf("Input the number you wish to delete:\n");
  scanf("%d",&s);//输入所要删除的数
  chaishu(str5,s);
  shanshu(str4,str5,n,s);//删数
  maopao(str4,n,s);//冒泡
  w=weishu(n)-weishu(s);
  for(a=0;a<=w;a++)//确保所出的第一位不是0
      if(str4[a]==0) break;
  for(b=a;b<=w;b++)   
      printf("%d",str4[a]);//输出

  
}

程序基本没有问题,就是几个小的细节问题,#define  p 10后面不应该有;在各个分函数前面注意用void 不应该用int.程序已经调试成功。
2011-04-07 19:15
饭桶
Rank: 6Rank: 6
等 级:侠之大者
帖 子:165
专家分:422
注 册:2011-4-5
收藏
得分:0 
回复 2楼 sange
太感谢你啦!编译是没问题,但是运行的时候会有点问题,可能我的逻辑有错误吧,谢谢你!!!

人得一生得奋斗!
2011-04-07 22:25
hnuhsg1226
Rank: 9Rank: 9Rank: 9
来 自:中国
等 级:蜘蛛侠
威 望:2
帖 子:314
专家分:1314
注 册:2011-3-27
收藏
得分:2 
呵呵,学习学习

我的地盘
2011-04-08 00:19
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
收藏
得分:2 
强分区

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2011-04-08 23:42
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
程序代码:
/*
应该是楼主没有理解题意.
题目要求应该是从 n 位正整数 a 中删除掉任意 k 位,而不是删除掉 k 的各位数字.

分析:
以 a[i], (0 <= i < n)表示 n 位正整数 a 的第 i 位, a[0] 为最高位, a[n - 1] 为最低位, n 位数字 a 可以写成以下形式:
a[0] * 10 ^ (n - 1) + a[1] * 10 ^ (n - 2) + a[2] * 10 ^ (n - 3) + ... + a[n - 2] * 10 ^ 1 + a[n - 1] * 10 ^ 0
经观察可知 d[0] 比 d[k], (0 < k < n) 对数字 a 的值的影响比 d[k] 更为明显, 我们说 d[0] 比 d[k] 更为重要.
一般而论, d[i] 比 d[k], (i < k < n) 更为重要.

题目要求“剩下的数字按原次序排列组成一个新的正整数”和“对于给定的正整数 a,编程计算删去 k 个数字后得到的最小数”.
因此思考的重点为如何得到最小的数.

设 n - k = m, 题目的正确答案为 m 位数字 b,
则 b[0] 必然是 a[0] ~ a[k] 中的一位数字, 且 b[0] 为 a[0] ~ a[k] 中 最小的一位数字, 如下例:

n = 4, a = 4123, k = 2;
从 4 位正整数 a 中删掉任意 2 位后,可能的结果为:
12
13
23
41
42
43
b = 12, b[0] = 1 = a[2] 为 a[0] ~ a[2] (即 4, 1, 2) 中最小的数字.

因此我们所设计的程序应首先找出a[0] ~ a[k] 中最小的一位 a[j], 并将此位作为答案的最高位 b[0]. 
要达到此目的,必须从 n 为正整数 a 中删除 a[0] ~ a[j - 1] 共 j 位.
因 a[j] 需要保留作为答案 b 的最高位,因此应将 j 从剩下的需要继续删除的数字中排除.

至此我们已经从 n 位正整数 a 中删除了 j 位,并排除了 1 位,接下来我们还需要删除 k - j 位.
为了保证最后的答案 b 最小, 必须保证从剩下的 n - j 位中删除 k - j位后所得的数字最小,为此我们只需要重复上述过程, 直至一共删除 k 位为止.

算法: 
1. s = 0; s 表示搜索的起始位置
2. 找出 a[j] == min(a[s], a[s + 1], ... , a[k])
3. a[0] = -1, a[1] = -1 ... a[j - 1] = -1; a[0] = -1 表示删除a[0];
4. s = j + 1, k -= j - s; 从 a[j] 的下一位开始进行下一次的搜索, 即将 a[j] 从待删除数字中排除
5. 重复 2 ~ 4, 直至 k == 0 || n - s == k; n - s == k 时不需要再进行搜索, 只要把 a[s] ~ a[n] 全部删掉即可

代码:
*/

#include <stdio.h>
#include <string.h>

int main() {
    char a[100] = {0}, i, j = 0, n, s = 0, is_1st_digit = 1;
    int k;
            
    printf("Please input number a: ");
    scanf("%s", a);
    n = strlen(a);
    printf("Please tell me how many digits to be deleted: ");
    scanf("%d", &k);
                                
    while (k > 0 && k < n - s) {
        // find the minimun digit a[j]
        for (i = s; i <= s + k; i++) {
            if (a[i] < a[j]) {
                if (!is_1st_digit || a[i] != '0') {
                    j = i;
                }
            }
        }

        // delet digits a[s] ~ a[j - 1]
        for (i = s; i < j; i++) {
            a[i] = -1;
        }
        
        // calculate how many more digits need to be deleted 
        k -= j - s;
        
        // next search will start from a[j + 1]
        j++;
        s = j;

        // there is only one 1st digit and we've already found it, so
        is_1st_digit = 0;
    }
    
    if (k > 0) {
        // delete digits d[s] ~ d[n]
        n = s;
    }
    
    // printf() the answer.
    for (i = 0; i < n; i++) {
        if (a[i] != -1) {
            printf("%c", a[i]);
        }
    }
    printf("\n");
    return 0;
}

不知道以上理解是否正确

[ 本帖最后由 voidx 于 2011-4-11 00:16 编辑 ]
2011-04-10 14:44
饭桶
Rank: 6Rank: 6
等 级:侠之大者
帖 子:165
专家分:422
注 册:2011-4-5
收藏
得分:0 
你的算法是对的,谢谢你!   
我们学校限制上网时间,我有很多天没有上网啦,所以才会这么晚回复你,对不起!
谢谢你,给我上了一课!

人得一生得奋斗!
2011-04-20 22:27
快速回复:删数题:编译的时候提示错误缺少数组界限符
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024510 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved