Hỏi về xuất số chính phương bằng viết hàm trực tiếp

hàm xuất đúng khi cho n<5 chữ số, và xuất thiếu khi n> 5 chữ số…giúp em với các anh ơi.

#include <math.h>
#include <conio.h>

void inchinhphuong(long n)  // đã sữa
{
    long i=1; // đã sữa
    for(i; i<n; i++)
    {
        float cp = sqrt((float)i);
        long thucp = cp;
        if(i == thucp*thucp)
            printf("%d   ",i);        //đã sữa 2
    }
}
void main()
{
    long n;  // đã sữa
    printf("nhap vao n, 0<n<10 trieu:\n");
    scanf("%d",&n);
    while(!(0<n && n<10000000))
    {
        printf("nhap lai n, 0<n<10 trieu:\n");
        scanf("%d",&n);
    }
printf("so chinh phuong nho hon n la:\n ");  // đã sữa
    inchinhphuong(n);
    getch();
}

anh LTD, nguyên nhân là: ở đã sữa 2 // cũ là: printf("so chinh phuong la:\n%d ",i);dài quá nên cửa sổ không hiển thị hết các giá trị được xuất ra, và đã sữa kiểu int thành long để để không gian cho n :blush:

Đã sửa một số lỗi cú pháp, chương trình của em bị lỗi gì em phải nói rõ ra chứ?

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void inchinhphuong(int n)
{
    int i=1;
    for(; i<n; i++)
    {
        float cp = sqrt((float)i);
        int thucp = cp;
        if(i == thucp*thucp)
            printf("\nso chinh phuong la:\n%d",i);
    }
}
int main()
{
    int n;
    printf("nhap vao n, 0<n<10 trieu:\n");
    scanf("%d",&n);
    while(!(0<n && n<10000000))
    {
        printf("nhap lai n, 0<n<10 trieu:\n");
        scanf("%d",&n);
    }
    inchinhphuong(n);
    getchar();
    return 0;
}
1 Like

Vì n nhập vào có thể lên tới 10.000.000 trong khi kiểu int chỉ lưu từ -32.768<=n<32.768 nên khi nhập số lớn hơn nó sẽ bị sai. Bạn nên thay thành kiểu long để lưu trữ số |n| <=1.000.000.000


Theo mình nên chạy biến i và in ra luôn. Vì i chạy tư 1-> sqrt(n) nên nhanh hơn.

int inchinhphuong(long n){
  long i=1;
  while(i*i<=n){
    printf("%ld\n",i*i);
    i++;
  }
}

http://ideone.com/bf0KM5

4 Likes

// đã sữa nhưng kết quả vẫn vậy anh à

lỗi ở chỗ, vd như e nhập n= 10000 thì xuất đúng số chính phương từ 1 đến 9801, nhưng n=100000 thì xuất từ 27889 đến 99856 chứ không xuất từ 1…á anh

sory mấy anh, em đã biết nguyên nhân :blush:

@dangtrantuananh13 sửa lại bài và cho biết nguyên nhân lên post 1 đi

Cách sửa bài

1 Like

mà mình nghĩ 1 số chính phương thì i = nguyen*nguyen chứ , sao bạn lại để dạng float nhỉ ?

1 Like
#include<stdio.h>
#include<math.h>
void chinhPhuong(int soNguyen);
int main(){
	int soNguyen;
	do{
	printf("Nhap so nguyen:");
	scanf("%d",&soNguyen);
	if(soNguyen<0&&soNguyen>10000000)
		printf("SO nguyen da nhap khong hop le.Xin moi nhap lai.\n");
	}
	while(soNguyen<0||soNguyen>10000000);
	return 0;
}
void chinhPhuong(int soNguyen){
for(int i=0;i<soNguyen;i++){
	if((int)sqrt((double)i)==(float)sqrt((double)i))
		printf("%d\t",i);
}
printf("\n");
}

Đây là code của minh.Mình dựa trên ý tưởng số chính phương là những số có căn bậc hai là số nguyên kết hợp với ép kiểu.

1 Like
float cp = sqrt((float)i);
long thucp = cp;         
if(i == thucp*thucp)              //thucp là kiêu nguyen đó bạn
if(soNguyen<=0 | soNguyen>=10000000)
			printf("SO nguyen da nhap khong hop le.Xin moi nhap lai.\n");
	}
	while(soNguyen<=0 | soNguyen>=10000000);
	chinhPhuong(soNguyen);
	getch();
}
// mình sữa lại một ít, thanks ban nhiều :v
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?