Nhập n in ra tất cả các số từ 1-> n sao cho bình phương của số đó là số "hạnh phúc"

Viết chương trình nhập n in ra tất cả các số từ 1-> n sao cho bình phương của số đó là số “hạnh phúc”.
p/s: định nghĩa số hp của thầy mình dạy là số chia nửa ra sao cho tổng nửa bên này = tổng nửa kia.

VD: 13522. (1+3=2+2) 5 không tính -_- (thầy mình kêu đây cũng là số hp mới khó hiểu chứ)
4581 (4+5=8+1)

(
khó quá các bác ơi T.T.
em mới học đến mảng vs mấy vòng lặp thôi)

số 13-5-22 mỗi bên một nữa đúng rồi còn gì =))

Anh giải thích giùm em code với @@ nhìn vô em chả hiểu gì

từ em ơi =)) test lại thì anh thấy đang có vấn đề ,nhập n <= 100 thì in ra đúng nhưng lên nữa thì …

#include <conio.h>
#include <stdio.h>
main(){
	printf("Liet ke so hanh phuc\n");
	int n,i1,i2,dem,s1,s2,dem1,dem2;
	do{
		printf("Nhap so >0: ");
		scanf("%d",&n);
	}while (n<=0);
		for (int i=10;i<=n;i++){
			i1=i*i;
			i2=i1;
			s1=0; s2=0;
			dem=0;
			while (i1>0){
				i1=i1/10;
				dem++;
			}
			if (dem%2==0){
				dem1=dem/2;
				while (dem>dem1){
					s1+= i2%10;
					i2=i2/10;
					dem--;
				}
				while (dem>0){
					s2+=i2%10;
					i2=i2/10;
					dem--;
				}
			}
			else if (dem%2!=0){
				dem2=(dem/2)+1;
				while (dem>dem2){
					s1+= i2%10;
					i2=i2/10;
					dem--;
				}
				dem--;
				i2/=10;
				while (dem>0){
					s2+=i2%10;
					i2=i2/10;
					dem--;
				}
			}
			if (s1==s2) printf("%d ",i);
		}
	getch();
}

Đây em đã chỉnh sửa lại thuật toán lần này đảm bảo đúng 100% :smiley: nãy giờ ngồi test tay muốn tắt cả thở :sure:

Bạn test xem thử thế nào :wink: mình không biết các số từ 0 đến 10 có phải là số hạnh phúc không nên mình cho chạy từ i=10 đến n :smiley: mình nhập n=13 thì nó in ra 11( 11^2 = 121 ) là số hạnh phúc :smiley: bạn có bộ số để test thì test hộ mình :blush:

1 Like

@hoangtrung1999 Như này nhé :smile:

  • Đầu tiên em cho nhập giới hạn n>0

  • Rồi em cho chạy vòng lặp i=10;i<=n;i++

  • với mỗi i thì em sẽ phải tính i^2 i1=i*i

  •   			i1=i1/10;
      			dem++;
    

để xem thử là sối*i đó có bao nhiêu chữ số (chẵn, lẽ), với mỗi TH sẽ có cách xử lí khác nhau . TH: Chẵn:```

dem1=dem/2;
				while (dem>dem1){
					s1+= i2%10;
					i2=i2/10;
					dem--;
				}
				while (dem>0){
					s2+=i2%10;
					i2=i2/10;
					dem--;
				}

cái chỗ này em copy code về chạy debug với 1 con số nhỏ thôi thì sẽ hiểu ngay, đối với TH lẻ thì tương tự

  • cuối cùng là so sánh 2 cái tổng, nếu thoả đk thì in i ra ngoài :smiley:

thanks kiu bác :">. em nghĩ hoài k ra cái thuật toán :(. để em nghĩ xem có cách nào gọn hơn nữa k.hehehe

1 Like

Các bác coi code em sai chỗ nào với toàn in ra là số k hạnh phúc :tired_face:

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

#define N 1000

void SoHanhPhuc(int n);

int main(void)
{
	int n,binhphuong;
	scanf("%d",&n);
	binhphuong=n*n;
	SoHanhPhuc(binhphuong);
	return 0;
}

void SoHanhPhuc(int n)
{
	int i, sodu, chu=0;
	int temp;
	int dem[N];
	while (n>0)
	{
		sodu=n%10;
		temp=sodu;
		dem[chu]=temp;
		printf("%d\n",dem[chu]);
		chu=chu+1;
		n=n/10;
	}
	int Tong1=0, Tong2=0;
	if (chu%2==0)
	{
		for (i=0; i<chu/2; i++)
		{
			Tong1 = Tong1 +dem[i];
		}
		for (i=chu/2 ; i< chu; i++)
		{
			Tong2 = Tong2 + dem[i];
		}
		if (Tong1 == Tong2) 
		{
			printf("So hanh phuc\n");
		}
		else printf("So khong hanh phuc\n");
	}
	else if ( chu%2!=0)
	{
		for (i=0; i< chu/2; i++)
		{
			Tong1 = Tong1 + dem[i];
		}
		for (i = (chu/2) + 1; i< chu; i++)
		{
			Tong2 = Tong2 + dem[i];
		}
		if (Tong1 == Tong2 && Tong1 == dem[chu/2] && Tong2 == dem[chu/2] )
			printf("So hanh phuc\n");
		else 
			printf("So khong hanh phuc\n");
	}
	return;
}

à code chạy rồi do mình nhập vào k phải số hạnh phúc nên nó k hạnh phúc :v: cảm ơn thớt bài tập rất hay :smiley:

1 Like

Bác dùng mảng à :smile: để em tham khảo với

1 Like
#include<stdio.h>
#include<conio.h>

  int sosanh(int n)
  {
  int m=n, count=0,count2=0,s1=0,s2=0;
        
        
    while(n>0){
    	n/=10;
    	count++;
	}
	
		while(count2<count/2){
			 s1+=m%10;
			 count2++;
			 m /= 10;
		}
    	if (count%2==1)	{
    		m /= 10;
		}		
		while(m>0){
			s2+=m%10;
			m = m/10;	
		}
		if(s1==s2) return 1;
		else return 0;

}

   main(){
   	int n, i;
   	printf("nhap n = ");
   	scanf("%d",&n);
   	for(i=1;i<=n;i++)
	   
  if(sosanh(i*i)==1&&i>=10)
   	printf("%d\n",i);

	   }

code này ngắn hơn chưa bác :blush:

Bác test thử xem có đúng không :smiley:

# pseudocode

def cool?(n)
   a = n.digits
   a[0..n.length/2].sum == a[(n.length+1)/2..].sum
end

def main_loop
   n = gets.chomp.to_i
   if n<=22: print [1,2,3,22].fetch_head(v => v<=n); break;
   [23..n+1].each do |i| print(i, ' ') if cool?(i*i); end
   # p [23..n+1].keep &cool?
end
1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?