如題 小弟我在自己的編譯器試過完全沒問題
但丟上來卻一直顯示記憶體區段錯誤
不知道是哪裡發生了問題
以下程式碼
#include <stdio.h>
#include <stdlib.h>
#define MAX 10100
void swap(int *,int);
int arrayLength (char *);
void sort (char *, int);
int main(){
int num;
while (scanf("%d",&num) != EOF){
int i=0,j=0;
char *bigNum;
bigNum = (char*)calloc(num * MAX, sizeof(char)); //配置大數字串陣列
if( bigNum == NULL ) {
fprintf(stderr, "Error: unable to allocate required memory\n");
return 1;
}
//fflush(stdin);
getchar();
while (1){
scanf("%c", bigNum + i * MAX + j);
if (*(bigNum + i * MAX + j) == '\n' && i == num - 1){
break;
}
else if (*(bigNum + i * MAX + j) == '\n'){
i += 1;
j = 0;
}
else {
j += 1;
}
}
sort(bigNum, num);
// for (int k=0;k<num;k++){
// for (int l=0;l<MAX;l++){
// printf("%c",*(bigNum+k*MAX+l));
// }
// }
free (bigNum);
}
}
void swap(int *array,int n){
int t = array[n];
array[n] = array[n-1];
array[n-1] = t;
}
int arrayLength (char *array){
int length = 0;
for (int i = 0; i < MAX; i++){
if (*(array + i) != 0){
length++;
}
else {
break;
}
}
return length;
}
void sort (char *numStr, int num){
int *sorted, i=1;
sorted = (int*)calloc(num, sizeof(char));
for (int x=0; x<num; x++){
sorted[x] = x;
}
while (i < num) {
int j = 0;
if (*(numStr + i * MAX + j) == '-'){ //負數比較
//printf("- i=%d\n",i);
int k = i;
while (k > 0){
if (arrayLength(numStr + sorted[k] * MAX) > arrayLength(numStr + sorted[k-1] * MAX)){ //先比長度
swap (sorted,k);
//printf("-SWAP L k=%d\n",k);
}
else if (arrayLength(numStr + sorted[k] * MAX) == arrayLength(numStr + sorted[k-1] * MAX)){ //長度一樣再比數字
//printf("Same L\n");
int n = 1;
while (n < arrayLength(numStr + sorted[k] * MAX)) {
if (*(numStr + sorted[k] * MAX + n) > *(numStr + sorted[k-1] * MAX + n)){
swap (sorted,k);
//printf("-SWAP N k=%d\n",k);
}
else if (*(numStr + sorted[k] * MAX + n) < *(numStr + sorted[k-1] * MAX + n)){
break;
}
n++;
}
}
k--;
}
}
else { // 正數比較
//printf("+ i=%d\n",i);
int k = i;
while (k > 0) {
if (*(numStr + sorted[k-1] * MAX + j) == '-'){
break;
}
else {
if (arrayLength(numStr + sorted[k] * MAX) < arrayLength(numStr + sorted[k-1] * MAX)){ //先比長度
swap (sorted,k);
//printf("+SWAP L k=%d\n",k);
}
else if (arrayLength(numStr + sorted[k] * MAX) == arrayLength(numStr + sorted[k-1] * MAX)){ //長度一樣再比數字
//printf("Same L\n");
int n = 0;
while (n < arrayLength(numStr + sorted[k] * MAX)) {
if (*(numStr + sorted[k] * MAX + n) < *(numStr + sorted[k-1] * MAX + n)){
swap (sorted,k);
//printf("+SWAP N k=%d\n",k);
}
else if (*(numStr + sorted[k] * MAX + n) > *(numStr + sorted[k-1] * MAX + n)){
break;
}
n++;
}
}
}
k--;
}
}
i++;
}
for (int x = 0;x < num;x++){
for (int y = 0;y < MAX;y++){
printf("%c",*(numStr + sorted[x] * MAX + y));
}
}
free(sorted);
}
如題 小弟我在自己的編譯器試過完全沒問題
但丟上來卻一直顯示記憶體區段錯誤
不知道是哪裡發生了問題
以下程式碼
#include
#include
#define MAX 10100
void swap(int *,int);
int arrayLength (char *);
void sort (char *, int);
int main(){
int num;
while (scanf("%d",&num) != EOF){
int i=0,j=0;
char *bigNum;
bigNum = (char*)calloc(num * MAX, sizeof(char)); //配置大數字串陣列
if( bigNum == NULL ) {
fprintf(stderr, "Error: unable to allocate required memory\n");
return 1;
}
//fflush(stdin);
getchar();
while (1){
scanf("%c", bigNum + i * MAX + j);
if (*(bigNum + i * MAX + j) == '\n' && i == num - 1){
break;
}
else if (*(bigNum + i * MAX + j) == '\n'){
i += 1;
j = 0;
}
else {
j += 1;
}
}
sort(bigNum, num);
// for (int k=0;k<num;k++){
// for (int l=0;l<MAX;l++){
// printf("%c",*(bigNum+k*MAX+l));
// }
// }
free (bigNum);
}
}
void swap(int *array,int n){
int t = array[n];
array[n] = array[n-1];
array[n-1] = t;
}
int arrayLength (char *array){
int length = 0;
for (int i = 0; i < MAX; i++){
if (*(array + i) != 0){
length++;
}
else {
break;
}
}
return length;
}
void sort (char *numStr, int num){
int *sorted, i=1;
sorted = (int*)calloc(num, sizeof(char));
for (int x=0; x<num; x++){
sorted[x] = x;
}
while (i < num) {
int j = 0;
if (*(numStr + i * MAX + j) == '-'){ //負數比較
//printf("- i=%d\n",i);
int k = i;
while (k > 0){
if (arrayLength(numStr + sorted[k] * MAX) > arrayLength(numStr + sorted[k-1] * MAX)){ //先比長度
swap (sorted,k);
//printf("-SWAP L k=%d\n",k);
}
else if (arrayLength(numStr + sorted[k] * MAX) == arrayLength(numStr + sorted[k-1] * MAX)){ //長度一樣再比數字
//printf("Same L\n");
int n = 1;
while (n < arrayLength(numStr + sorted[k] * MAX)) {
if (*(numStr + sorted[k] * MAX + n) > *(numStr + sorted[k-1] * MAX + n)){
swap (sorted,k);
//printf("-SWAP N k=%d\n",k);
}
else if (*(numStr + sorted[k] * MAX + n) < *(numStr + sorted[k-1] * MAX + n)){
break;
}
n++;
}
}
k--;
}
}
else { // 正數比較
//printf("+ i=%d\n",i);
int k = i;
while (k > 0) {
if (*(numStr + sorted[k-1] * MAX + j) == '-'){
break;
}
else {
if (arrayLength(numStr + sorted[k] * MAX) < arrayLength(numStr + sorted[k-1] * MAX)){ //先比長度
swap (sorted,k);
//printf("+SWAP L k=%d\n",k);
}
else if (arrayLength(numStr + sorted[k] * MAX) == arrayLength(numStr + sorted[k-1] * MAX)){ //長度一樣再比數字
//printf("Same L\n");
int n = 0;
while (n < arrayLength(numStr + sorted[k] * MAX)) {
if (*(numStr + sorted[k] * MAX + n) < *(numStr + sorted[k-1] * MAX + n)){
swap (sorted,k);
//printf("+SWAP N k=%d\n",k);
}
else if (*(numStr + sorted[k] * MAX + n) > *(numStr + sorted[k-1] * MAX + n)){
break;
}
n++;
}
}
}
k--;
}
}
i++;
}
for (int x = 0;x < num;x++){
for (int y = 0;y < MAX;y++){
printf("%c",*(numStr + sorted[x] * MAX + y));
}
}
free(sorted);
}
用範例測資測試了一下,你的程式碼第一組測資可以正常運行,但在第二組測資時,似乎是底下這幾行(第19-31行)產生了記憶體區段錯誤的問題。
while (1){
scanf("%c", bigNum + i * MAX + j);
if (*(bigNum + i * MAX + j) == '\n' && i == num - 1){
break;
}
else if (*(bigNum + i * MAX + j) == '\n'){
i += 1;
j = 0;
}
else {
j += 1;
}
}
至於具體的原因,有待高手解答...我的C++並不好
將break的條件改成以下
if ((*(bigNum + i * MAX + j) == EOF || *(bigNum + i * MAX + j) == '\n' || *(bigNum + i * MAX + j) == ' ') && i == num - 1)
break;
可以成功AC範例測資,但送出之後會有WA line10的問題
您的答案為: 12318283718923789127389172389172837129837128937128937189237189237891273891723897 ...略 正確答案為: -22222222222222222222222222222222222222222222222222222222222222222222222222
如題 小弟我在自己的編譯器試過完全沒問題
但丟上來卻一直顯示記憶體區段錯誤
不知道是哪裡發生了問題
以下程式碼
#include
#include
#define MAX 10100
void swap(int *,int);
int arrayLength (char *);
void sort (char *, int);
int main(){
int num;
while (scanf("%d",&num) != EOF){
int i=0,j=0;
char *bigNum;
bigNum = (char*)calloc(num * MAX, sizeof(char)); //配置大數字串陣列
if( bigNum == NULL ) {
fprintf(stderr, "Error: unable to allocate required memory\n");
return 1;
}
//fflush(stdin);
getchar();
while (1){
scanf("%c", bigNum + i * MAX + j);
if (*(bigNum + i * MAX + j) == '\n' && i == num - 1){
break;
}
else if (*(bigNum + i * MAX + j) == '\n'){
i += 1;
j = 0;
}
else {
j += 1;
}
}
sort(bigNum, num);
// for (int k=0;k<num;k++){
// for (int l=0;l<MAX;l++){
// printf("%c",*(bigNum+k*MAX+l));
// }
// }
free (bigNum);
}
}
void swap(int *array,int n){
int t = array[n];
array[n] = array[n-1];
array[n-1] = t;
}
int arrayLength (char *array){
int length = 0;
for (int i = 0; i < MAX; i++){
if (*(array + i) != 0){
length++;
}
else {
break;
}
}
return length;
}
void sort (char *numStr, int num){
int *sorted, i=1;
sorted = (int*)calloc(num, sizeof(char));
for (int x=0; x<num; x++){
sorted[x] = x;
}
while (i < num) {
int j = 0;
if (*(numStr + i * MAX + j) == '-'){ //負數比較
//printf("- i=%d\n",i);
int k = i;
while (k > 0){
if (arrayLength(numStr + sorted[k] * MAX) > arrayLength(numStr + sorted[k-1] * MAX)){ //先比長度
swap (sorted,k);
//printf("-SWAP L k=%d\n",k);
}
else if (arrayLength(numStr + sorted[k] * MAX) == arrayLength(numStr + sorted[k-1] * MAX)){ //長度一樣再比數字
//printf("Same L\n");
int n = 1;
while (n < arrayLength(numStr + sorted[k] * MAX)) {
if (*(numStr + sorted[k] * MAX + n) > *(numStr + sorted[k-1] * MAX + n)){
swap (sorted,k);
//printf("-SWAP N k=%d\n",k);
}
else if (*(numStr + sorted[k] * MAX + n) < *(numStr + sorted[k-1] * MAX + n)){
break;
}
n++;
}
}
k--;
}
}
else { // 正數比較
//printf("+ i=%d\n",i);
int k = i;
while (k > 0) {
if (*(numStr + sorted[k-1] * MAX + j) == '-'){
break;
}
else {
if (arrayLength(numStr + sorted[k] * MAX) < arrayLength(numStr + sorted[k-1] * MAX)){ //先比長度
swap (sorted,k);
//printf("+SWAP L k=%d\n",k);
}
else if (arrayLength(numStr + sorted[k] * MAX) == arrayLength(numStr + sorted[k-1] * MAX)){ //長度一樣再比數字
//printf("Same L\n");
int n = 0;
while (n < arrayLength(numStr + sorted[k] * MAX)) {
if (*(numStr + sorted[k] * MAX + n) < *(numStr + sorted[k-1] * MAX + n)){
swap (sorted,k);
//printf("+SWAP N k=%d\n",k);
}
else if (*(numStr + sorted[k] * MAX + n) > *(numStr + sorted[k-1] * MAX + n)){
break;
}
n++;
}
}
}
k--;
}
}
i++;
}
for (int x = 0;x < num;x++){
for (int y = 0;y < MAX;y++){
printf("%c",*(numStr + sorted[x] * MAX + y));
}
}
free(sorted);
}
用範例測資測試了一下,你的程式碼第一組測資可以正常運行,但在第二組測資時,似乎是底下這幾行(第19-31行)產生了記憶體區段錯誤的問題。
while (1){
scanf("%c", bigNum + i * MAX + j);
if (*(bigNum + i * MAX + j) == '\n' && i == num - 1){
break;
}
else if (*(bigNum + i * MAX + j) == '\n'){
i += 1;
j = 0;
}
else {
j += 1;
}
}
至於具體的原因,有待高手解答...我的C++並不好
將break的條件改成以下
if ((*(bigNum + i * MAX + j) == EOF || *(bigNum + i * MAX + j) == '\n' || *(bigNum + i * MAX + j) == ' ') && i == num - 1)
break;
可以成功AC範例測資,但送出之後會有WA line10的問題
您的答案為: 12318283718923789127389172389172837129837128937128937189237189237891273891723897 ...略 正確答案為: -22222222222222222222222222222222222222222222222222222222222222222222222222
嗯....這樣看起來還是記憶體的問題
自己再看了一下感覺最有可能造成記憶體錯誤的只有陣列越界存取
但還是不清楚是哪裡造成的
再請求各位大神指導了
如題 小弟我在自己的編譯器試過完全沒問題
但丟上來卻一直顯示記憶體區段錯誤
不知道是哪裡發生了問題
以下程式碼
#include
#include
#define MAX 10100
void swap(int *,int);
int arrayLength (char *);
void sort (char *, int);
int main(){
int num;
while (scanf("%d",&num) != EOF){
int i=0,j=0;
char *bigNum;
bigNum = (char*)calloc(num * MAX, sizeof(char)); //配置大數字串陣列
if( bigNum == NULL ) {
fprintf(stderr, "Error: unable to allocate required memory\n");
return 1;
}
//fflush(stdin);
getchar();
while (1){
scanf("%c", bigNum + i * MAX + j);
if (*(bigNum + i * MAX + j) == '\n' && i == num - 1){
break;
}
else if (*(bigNum + i * MAX + j) == '\n'){
i += 1;
j = 0;
}
else {
j += 1;
}
}
sort(bigNum, num);
// for (int k=0;k<num;k++){
// for (int l=0;l<MAX;l++){
// printf("%c",*(bigNum+k*MAX+l));
// }
// }
free (bigNum);
}
}
void swap(int *array,int n){
int t = array[n];
array[n] = array[n-1];
array[n-1] = t;
}
int arrayLength (char *array){
int length = 0;
for (int i = 0; i < MAX; i++){
if (*(array + i) != 0){
length++;
}
else {
break;
}
}
return length;
}
void sort (char *numStr, int num){
int *sorted, i=1;
sorted = (int*)calloc(num, sizeof(char));
for (int x=0; x<num; x++){
sorted[x] = x;
}
while (i < num) {
int j = 0;
if (*(numStr + i * MAX + j) == '-'){ //負數比較
//printf("- i=%d\n",i);
int k = i;
while (k > 0){
if (arrayLength(numStr + sorted[k] * MAX) > arrayLength(numStr + sorted[k-1] * MAX)){ //先比長度
swap (sorted,k);
//printf("-SWAP L k=%d\n",k);
}
else if (arrayLength(numStr + sorted[k] * MAX) == arrayLength(numStr + sorted[k-1] * MAX)){ //長度一樣再比數字
//printf("Same L\n");
int n = 1;
while (n < arrayLength(numStr + sorted[k] * MAX)) {
if (*(numStr + sorted[k] * MAX + n) > *(numStr + sorted[k-1] * MAX + n)){
swap (sorted,k);
//printf("-SWAP N k=%d\n",k);
}
else if (*(numStr + sorted[k] * MAX + n) < *(numStr + sorted[k-1] * MAX + n)){
break;
}
n++;
}
}
k--;
}
}
else { // 正數比較
//printf("+ i=%d\n",i);
int k = i;
while (k > 0) {
if (*(numStr + sorted[k-1] * MAX + j) == '-'){
break;
}
else {
if (arrayLength(numStr + sorted[k] * MAX) < arrayLength(numStr + sorted[k-1] * MAX)){ //先比長度
swap (sorted,k);
//printf("+SWAP L k=%d\n",k);
}
else if (arrayLength(numStr + sorted[k] * MAX) == arrayLength(numStr + sorted[k-1] * MAX)){ //長度一樣再比數字
//printf("Same L\n");
int n = 0;
while (n < arrayLength(numStr + sorted[k] * MAX)) {
if (*(numStr + sorted[k] * MAX + n) < *(numStr + sorted[k-1] * MAX + n)){
swap (sorted,k);
//printf("+SWAP N k=%d\n",k);
}
else if (*(numStr + sorted[k] * MAX + n) > *(numStr + sorted[k-1] * MAX + n)){
break;
}
n++;
}
}
}
k--;
}
}
i++;
}
for (int x = 0;x < num;x++){
for (int y = 0;y < MAX;y++){
printf("%c",*(numStr + sorted[x] * MAX + y));
}
}
free(sorted);
}
用範例測資測試了一下,你的程式碼第一組測資可以正常運行,但在第二組測資時,似乎是底下這幾行(第19-31行)產生了記憶體區段錯誤的問題。
while (1){
scanf("%c", bigNum + i * MAX + j);
if (*(bigNum + i * MAX + j) == '\n' && i == num - 1){
break;
}
else if (*(bigNum + i * MAX + j) == '\n'){
i += 1;
j = 0;
}
else {
j += 1;
}
}
至於具體的原因,有待高手解答...我的C++並不好
將break的條件改成以下
if ((*(bigNum + i * MAX + j) == EOF || *(bigNum + i * MAX + j) == '\n' || *(bigNum + i * MAX + j) == ' ') && i == num - 1)
break;
可以成功AC範例測資,但送出之後會有WA line10的問題
您的答案為: 12318283718923789127389172389172837129837128937128937189237189237891273891723897 ...略 正確答案為: -22222222222222222222222222222222222222222222222222222222222222222222222222嗯....這樣看起來還是記憶體的問題
自己再看了一下感覺最有可能造成記憶體錯誤的只有陣列越界存取
但還是不清楚是哪裡造成的
再請求各位大神指導了
這是我參考你的下去修改的code,可以成功AC
#include <stdio.h>
#include <stdlib.h>
#define MAX 105
int len(char *arr){
int length = 0;
while(*(arr + length) != 0 && *(arr + length) != '\n' && *(arr + length) != EOF)
length++;
return length;
}
void swap(int *array, int n){
int t = array[n];
array[n] = array[n-1];
array[n-1] = t;
}
void sort(char *numStr, int num){
int *sorted = (int *)calloc(num, sizeof(int));
for(int k = 0; k < num; k++)
sorted[k] = k;
for(int i = num-1; i; i--){// bubble sort
for(int j = 0; j < i; j++){
bool isNegative[2];
isNegative[0] = *(numStr + sorted[j]*MAX) == '-' ? 1 : 0;
isNegative[1] = *(numStr + sorted[j+1]*MAX) == '-' ? 1 : 0;
if(isNegative[0] && !isNegative[1])// numStr[sorted[j]] < numStr[sorted[j+1]]
continue;
else if(!isNegative[0] && isNegative[1])// numStr[sorted[j]] > numStr[sorted[j+1]]
swap(sorted, j+1);
else{
int length[] = {len(numStr + sorted[j]*MAX), len(numStr + sorted[j+1]*MAX)};
if(isNegative[0]){// both of numbers are negative
if(length[0] > length[1])// numStr[sorted[j]] < numStr[sorted[j+1]]
continue;
else if(length[0] < length[1])// numStr[sorted[j]] > numStr[sorted[j+1]]
swap(sorted, j+1);
else
for(int k = 1; k < length[0]; k++)
if(*(numStr + sorted[j]*MAX + k) == *(numStr + sorted[j+1]*MAX + k))
continue;
else if(*(numStr + sorted[j]*MAX + k) > *(numStr + sorted[j+1]*MAX + k))// numStr[sorted[j]] < numStr[sorted[j+1]]
break;
else{ // numStr[sorted[j]] > numStr[sorted[j+1]]
swap(sorted, j+1);
break;
}
}else{// both of numbers are positive
if(length[0] < length[1])// numStr[sorted[j]] < numStr[sorted[j+1]]
continue;
else if(length[0] > length[1])// numStr[sorted[j]] > numStr[sorted[j+1]]
swap(sorted, j+1);
else
for(int k = 0; k < length[0]; k++)
if(*(numStr + sorted[j]*MAX + k) == *(numStr + sorted[j+1]*MAX + k))
continue;
else if(*(numStr + sorted[j]*MAX + k) < *(numStr + sorted[j+1]*MAX + k))// numStr[sorted[j]] < numStr[sorted[j+1]]
break;
else{ // numStr[sorted[j]] > numStr[sorted[j+1]]
swap(sorted, j+1);
break;
}
}
}
}
}
for(int i = 0; i < num; i++, putchar_unlocked('\n'))
for(int j = 0, limit = len(numStr + sorted[i]*MAX); j < limit; j++)
putchar_unlocked(*(numStr + sorted[i]*MAX + j));
free(sorted);
}
int main(){
int num;
while(~scanf("%d", &num)){
int i = 0, j = 0;
char *bigInt = (char *)calloc(num * MAX, sizeof(char));
getchar_unlocked();
while(i < num){
*(bigInt + i * MAX + j) = getchar_unlocked();
if(*(bigInt + i * MAX + j) == 0 || *(bigInt + i * MAX + j) == '\n' || *(bigInt + i * MAX + j) == EOF)
i++, j = 0;
else
j++;
}
sort(bigInt, num);
free (bigInt);
}
}
至於WA line10具體的原因個人不清楚,但的確有 12318283718923789127389172389172837129837128937128937189237189237891273891723897... 這行測資。(個人覺得有可能排序也有問題)
MAX的部分,不用開到10100那大,本題最大的數字小於10^100,其位數小於 floor(log10(10^100)) + 1 = 101,我自己是設105
如題 小弟我在自己的編譯器試過完全沒問題
但丟上來卻一直顯示記憶體區段錯誤
不知道是哪裡發生了問題
以下程式碼
#include
#include
#define MAX 10100
void swap(int *,int);
int arrayLength (char *);
void sort (char *, int);
int main(){
int num;
while (scanf("%d",&num) != EOF){
int i=0,j=0;
char *bigNum;
bigNum = (char*)calloc(num * MAX, sizeof(char)); //配置大數字串陣列
if( bigNum == NULL ) {
fprintf(stderr, "Error: unable to allocate required memory\n");
return 1;
}
//fflush(stdin);
getchar();
while (1){
scanf("%c", bigNum + i * MAX + j);
if (*(bigNum + i * MAX + j) == '\n' && i == num - 1){
break;
}
else if (*(bigNum + i * MAX + j) == '\n'){
i += 1;
j = 0;
}
else {
j += 1;
}
}
sort(bigNum, num);
// for (int k=0;k<num;k++){
// for (int l=0;l<MAX;l++){
// printf("%c",*(bigNum+k*MAX+l));
// }
// }
free (bigNum);
}
}
void swap(int *array,int n){
int t = array[n];
array[n] = array[n-1];
array[n-1] = t;
}
int arrayLength (char *array){
int length = 0;
for (int i = 0; i < MAX; i++){
if (*(array + i) != 0){
length++;
}
else {
break;
}
}
return length;
}
void sort (char *numStr, int num){
int *sorted, i=1;
sorted = (int*)calloc(num, sizeof(char));
for (int x=0; x<num; x++){
sorted[x] = x;
}
while (i < num) {
int j = 0;
if (*(numStr + i * MAX + j) == '-'){ //負數比較
//printf("- i=%d\n",i);
int k = i;
while (k > 0){
if (arrayLength(numStr + sorted[k] * MAX) > arrayLength(numStr + sorted[k-1] * MAX)){ //先比長度
swap (sorted,k);
//printf("-SWAP L k=%d\n",k);
}
else if (arrayLength(numStr + sorted[k] * MAX) == arrayLength(numStr + sorted[k-1] * MAX)){ //長度一樣再比數字
//printf("Same L\n");
int n = 1;
while (n < arrayLength(numStr + sorted[k] * MAX)) {
if (*(numStr + sorted[k] * MAX + n) > *(numStr + sorted[k-1] * MAX + n)){
swap (sorted,k);
//printf("-SWAP N k=%d\n",k);
}
else if (*(numStr + sorted[k] * MAX + n) < *(numStr + sorted[k-1] * MAX + n)){
break;
}
n++;
}
}
k--;
}
}
else { // 正數比較
//printf("+ i=%d\n",i);
int k = i;
while (k > 0) {
if (*(numStr + sorted[k-1] * MAX + j) == '-'){
break;
}
else {
if (arrayLength(numStr + sorted[k] * MAX) < arrayLength(numStr + sorted[k-1] * MAX)){ //先比長度
swap (sorted,k);
//printf("+SWAP L k=%d\n",k);
}
else if (arrayLength(numStr + sorted[k] * MAX) == arrayLength(numStr + sorted[k-1] * MAX)){ //長度一樣再比數字
//printf("Same L\n");
int n = 0;
while (n < arrayLength(numStr + sorted[k] * MAX)) {
if (*(numStr + sorted[k] * MAX + n) < *(numStr + sorted[k-1] * MAX + n)){
swap (sorted,k);
//printf("+SWAP N k=%d\n",k);
}
else if (*(numStr + sorted[k] * MAX + n) > *(numStr + sorted[k-1] * MAX + n)){
break;
}
n++;
}
}
}
k--;
}
}
i++;
}
for (int x = 0;x < num;x++){
for (int y = 0;y < MAX;y++){
printf("%c",*(numStr + sorted[x] * MAX + y));
}
}
free(sorted);
}
用範例測資測試了一下,你的程式碼第一組測資可以正常運行,但在第二組測資時,似乎是底下這幾行(第19-31行)產生了記憶體區段錯誤的問題。
while (1){
scanf("%c", bigNum + i * MAX + j);
if (*(bigNum + i * MAX + j) == '\n' && i == num - 1){
break;
}
else if (*(bigNum + i * MAX + j) == '\n'){
i += 1;
j = 0;
}
else {
j += 1;
}
}
至於具體的原因,有待高手解答...我的C++並不好
將break的條件改成以下
if ((*(bigNum + i * MAX + j) == EOF || *(bigNum + i * MAX + j) == '\n' || *(bigNum + i * MAX + j) == ' ') && i == num - 1)
break;
可以成功AC範例測資,但送出之後會有WA line10的問題
您的答案為: 12318283718923789127389172389172837129837128937128937189237189237891273891723897 ...略 正確答案為: -22222222222222222222222222222222222222222222222222222222222222222222222222嗯....這樣看起來還是記憶體的問題
自己再看了一下感覺最有可能造成記憶體錯誤的只有陣列越界存取
但還是不清楚是哪裡造成的
再請求各位大神指導了
這是我參考你的下去修改的code,可以成功AC
#include
#include
#define MAX 105
int len(char *arr){
int length = 0;
while(*(arr + length) != 0 && *(arr + length) != '\n' && *(arr + length) != EOF)
length++;
return length;
}
void swap(int *array, int n){
int t = array[n];
array[n] = array[n-1];
array[n-1] = t;
}
void sort(char *numStr, int num){
int *sorted = (int *)calloc(num, sizeof(int));
for(int k = 0; k < num; k++)
sorted[k] = k;
for(int i = num-1; i; i--){// bubble sort
for(int j = 0; j < i; j++){
bool isNegative[2];
isNegative[0] = *(numStr + sorted[j]*MAX) == '-' ? 1 : 0;
isNegative[1] = *(numStr + sorted[j+1]*MAX) == '-' ? 1 : 0;
if(isNegative[0] && !isNegative[1])// numStr[sorted[j]] < numStr[sorted[j+1]]
continue;
else if(!isNegative[0] && isNegative[1])// numStr[sorted[j]] > numStr[sorted[j+1]]
swap(sorted, j+1);
else{
int length[] = {len(numStr + sorted[j]*MAX), len(numStr + sorted[j+1]*MAX)};
if(isNegative[0]){// both of numbers are negative
if(length[0] > length[1])// numStr[sorted[j]] < numStr[sorted[j+1]]
continue;
else if(length[0] < length[1])// numStr[sorted[j]] > numStr[sorted[j+1]]
swap(sorted, j+1);
else
for(int k = 1; k < length[0]; k++)
if(*(numStr + sorted[j]*MAX + k) == *(numStr + sorted[j+1]*MAX + k))
continue;
else if(*(numStr + sorted[j]*MAX + k) > *(numStr + sorted[j+1]*MAX + k))// numStr[sorted[j]] < numStr[sorted[j+1]]
break;
else{ // numStr[sorted[j]] > numStr[sorted[j+1]]
swap(sorted, j+1);
break;
}
}else{// both of numbers are positive
if(length[0] < length[1])// numStr[sorted[j]] < numStr[sorted[j+1]]
continue;
else if(length[0] > length[1])// numStr[sorted[j]] > numStr[sorted[j+1]]
swap(sorted, j+1);
else
for(int k = 0; k < length[0]; k++)
if(*(numStr + sorted[j]*MAX + k) == *(numStr + sorted[j+1]*MAX + k))
continue;
else if(*(numStr + sorted[j]*MAX + k) < *(numStr + sorted[j+1]*MAX + k))// numStr[sorted[j]] < numStr[sorted[j+1]]
break;
else{ // numStr[sorted[j]] > numStr[sorted[j+1]]
swap(sorted, j+1);
break;
}
}
}
}
}
for(int i = 0; i < num; i++, putchar_unlocked('\n'))
for(int j = 0, limit = len(numStr + sorted[i]*MAX); j < limit; j++)
putchar_unlocked(*(numStr + sorted[i]*MAX + j));
free(sorted);
}
int main(){
int num;
while(~scanf("%d", &num)){
int i = 0, j = 0;
char *bigInt = (char *)calloc(num * MAX, sizeof(char));
getchar_unlocked();
while(i < num){
*(bigInt + i * MAX + j) = getchar_unlocked();
if(*(bigInt + i * MAX + j) == 0 || *(bigInt + i * MAX + j) == '\n' || *(bigInt + i * MAX + j) == EOF)
i++, j = 0;
else
j++;
}
sort(bigInt, num);
free (bigInt);
}
}
至於WA line10具體的原因個人不清楚,但的確有 12318283718923789127389172389172837129837128937128937189237189237891273891723897... 這行測資。(個人覺得有可能排序也有問題)
MAX的部分,不用開到10100那大,本題最大的數字小於10^100,其位數小於 floor(log10(10^100)) + 1 = 101,我自己是設105
那我會再測試一下
感謝指導